CS/Operating System

[운영체제]멀티프로세스와 멀티스레드

테리는당근을좋아해 2020. 6. 18. 20:35

멀티 프로세스와 멀티스레드

1) 멀티 프로세스

다수의 프로세스를 실행하는 것

 

2) 멀티 스레드

하나의 프로세스를 다수의 실행 단위로 나누어 실행하는 것

 

3) 멀티 프로세스와 멀티 스레드의 차이

(1) 멀티 프로세스

(+) 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스가 영향을 받지 않음

(+) 멀티 스레드처럼 동기화 작업이 별도로 필요하지 않음

(-) 자원 소모, 메모리 낭비, 문맥 교환으로 인한 비효율성

(-) IPC 통신으로 인한 비용

 

(2) 멀티 스레드

(+) 문맥 교환에 소비되는 시간을 줄일 수 있음(스택 영역만 문맥교환이 일어남)

(+) 자원을 공유하기 때문에 메모리 낭비를 줄임

(-) 동기화 작업이 필요

(-) 하나의 스레드가 비정상적으로 종료 시, 다른 스레드도 종료될 수 있음

 

4) 멀티스레드를 지향하는 이유

(1) 자원의 효율성

- 프로세스 간 문맥교환 시 오버헤드가 큼

 

(2) 처리 비용 감소 및 응답시간 단축

- 별도의 IPC 통신의 비용부담 감소

- 스레드 간 문맥 교환은 스택 영역만 처리되기 때문에 응답시간 단축

 

 

스레드풀(Thread pool)

1) 개념

- 스레드를 제한된 개수만큼 만들어놓고 작업 큐에 들어오는 작업들을 스레드가 하나씩 맡아서 처리

- 작업을 실행할 때마다 스레드를 생성/제거하는 것이 아닌 제한된 수의 스레드를 미리 만들어 사용/반환하는 기법

 

2) 장점

- 스레드 생성/제거에 드는 비용을 줄임으로써 성능 저하를 방지

- 다수의 사용자 요청 처리

- 스레드 풀 내의 스레드 수를 조절 가능

 

3) 단점

- 스레드 또한 메모리를 차지

- 작업량에 비해 너무 많은 스레드를 생성했을 시에 노는 스레드가 발생

 

 

사용자 수준 스레드와 커널 수준 스레드

1) 사용자 수준 스레드(User Level Thread)

- 커널 스레드와 사용자 스레드가 1:n 관계

- 커널에 의존적이지 않은 형태로 라이브러리를 활용하는 방식

 

(1) 장점

- 운영체제가 스레드를 지원할 필요가 없음

- 인터럽트 발생 시 문맥교환이 없어 오버헤드가 적음

 

(2) 단점

- 스케줄링 우선순위를 지원하지 않음

- I/O 작업 등에 의해 하나라도 블로킹되면 전체가 블로킹 됨

 

2) 커널 수준 스레드(Kernel Level Thread)

- 커널 스레드와 사용자 스레드가 1:1 관계

- 커널이 스레드를 관리하는 것으로 커널에 종속적이며, 스케줄링하는 주체가 커널

 

(1) 장점

- 커널이 각 스레드를 개별적으로 관리

- 커널이 직접 스레드를 제공하기 때문에 안정적이고 다양한 기능 제공

 

(2) 단점

- 커널을 호출하는데 무겁고 오래 걸림

- 성능 저하

- 비교적 다 많은 양의 자원 소비

 

스레드 안전(Thread Safe)

- 멀티 스레드 환경에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 의도한대로 동작하는 것

 

1) Thread Safe하게 구현한다는 것이란

- 공유 자원에 접근하는 임계 영역(Critical Section)을 동기화 기법으로 제어

 

2) Thread Safe를 지키기 위한 방법

(1) Re-Entrancy(재진입성)

- 어떤 함수를 여러 스레드가 동시에 접근해도 언제나 같은 결과를 보장

 

(2) Thread Local Storage

- 공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막음

 

(3) Mutual Exclusion

- 공유 자원을 꼭 사용해야할 경우 해당 자원의 접근을 뮤텍스, 세마포어 등의 동기화 작업으로 통제

 

(4) Atomic Operation

- 공유 자원에 접근할 때 원자 연산을 이용하거나, 원자적으로 정의된 접근 방법을 사용함으로써 상호배제 구현

 

문맥교환(Context Switching)

- 현재 진행하고 있는 Task(Process 나 Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정

 

1) Context Switching 과정

a. Task의 대부분 정보는 레지스터에 저장되고 PCB로 관리

b. 현재 실행하고 있는 Task의 정보를 PCB에 저장

c. 다음 실행할 Task의 정보를 PCB로 부터 읽어들여 레지스터에 적재하고, 이전에 수행했던 부분부터 작업을 진행

 

2) Context Switching Cost

- Process > Thread

- Thread는 스택 영역을 제외한 모든 메모리 영역을 공유하기 때문에 Context Switching cost가 적게 듬

- 또한, Process Context Switching 시에는 캐시 메모리가 초기화가 됨

 

 

멀티 프로세스와 멀티 스레드의 적절한 상황

1) 멀티 프로세스

- 브라우저의 각 탭(크롬)

- 한 프로세스가 비정상적으로 종료되더라도 다른 프로세스가 영향을 받지 않음

- 자원을 공유할 필요가 없음

 

2) 멀티 스레드

- 워드 프로세스와 같은 응용 소프트웨어

- 여러가지 기능과 메모리를 공유