출처 : https://www.youtube.com/watch?v=YlnvCIZQDkw&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=7
프로세스(Process)와 스레드(Thread)
프로세스가 하는 일은 자원을 할당 받고, 할당받은 자원을 제어해서 작업(목적)을 수행(달성)하는 것이다.
즉, 프로세스는 자원과 제어라는 2가지 요소로 나뉜다.
이 중, 제어하는 부분을 스레드라고 한다.
하나의 프로세스가 여러 자원을 할당받을 수 있다.(하나의 프로세스 안에 여러 자원을 제어하는 여러 개의 스레드가 있을 수 있다.)
위 그림에서 오른쪽이 리소스, 왼쪽이 제어(스레드) 이다. 스레드는 제어 정보와 지역 데이터, 스택 등으로 이루어져있고, 하나의 프로세스 안에 여러 개의 스레드들이 프로세스에 할당된 리소스를 공유해서 제어를 한다.
프로세스의 메모리 관점에서 보면 위 그림과 같다.
같은 프로세스의 스레드들은 동일한 주소 공간을 공유한다. 아래 부분의 힙, 데이터, 코드가 리소스이고, 각 스레드마다 자신의 스택(작업 영역)을 가지게 된다.
각 스레드에게 할당된 작업 영역을 사용해서 지역 데이터를 만들고 작업을 수행한다.
그리고 공유된 리소스 중 소스 코드에서 자신의 작업을 가르키고있는 PC(Program Counter, 제어를 위한 요소)를 통해 자신의 프로그램 흐름을 제어하게 된다.
스레드(Thread)
- 스레드는 Light Weight Process(LWP)라고도 한다. 프로세스는 자원과 제어 부분을 각각 가지고 있지만, 스레드는 자원은 공유하고 제어 부분만을 가지고 있기 때문이다.
- 프로세서(CPU) 활용의 기본 단위, 스레드가 여러 개라면 CPU를 여러개를 사용할 수 있다(= 여러 작업을 동시에 처리할 수 있다).
- 구성요소
- Thread ID
- Register set (Program Counter, Stack Pointer 등)
- Stack(작업 영역) (local data 등)
- 제어 요소(각 스레드 개인의 영역) 외 코드, 데이터 및 자원(공유되는 영역)들은 프로세스 내 다른 스레드들과 공유
- 전통적 프로세스 = 단일 스레드 프로세스
Single Thread Process : 제어 요소(스레드)가 하나인 프로세스
Multi_thread process : 제어 요소(스레드)가 여러 개인 프로세스
스레드의 장점
- 사용자 응답성 (Responsiveness)
- 일부 스레드의 처리가 지연되어도, 다른 스레드는 작업을 계속 처리 가능
- 자원 공유 (Resource sharing)
- 자원을 공유해서 효율성 증가 (커널의 개입을 피할 수 있음, 프로세스의 경우 하나의 프로세스(P1)가 리소스를 사용하는 동안 다른 프로세스(P2)는 대기 상태로 있어야 한다. 그리고 다른 프로세스(P1)가 대기 상태가 되어야만 프로세스 P2가 리소스를 사용할 수 있다. 이 과정에서 필연적으로 context switch가 발생한다. 하지만 스레드의 경우 여러 스레드가 리소스를 공유해서 동시에 작업을 수행하기 때문에 context switch를 발생시키지 않는다.)
- ex) 동일 address space에서 스레드 여러 개
- 자원을 공유해서 효율성 증가 (커널의 개입을 피할 수 있음, 프로세스의 경우 하나의 프로세스(P1)가 리소스를 사용하는 동안 다른 프로세스(P2)는 대기 상태로 있어야 한다. 그리고 다른 프로세스(P1)가 대기 상태가 되어야만 프로세스 P2가 리소스를 사용할 수 있다. 이 과정에서 필연적으로 context switch가 발생한다. 하지만 스레드의 경우 여러 스레드가 리소스를 공유해서 동시에 작업을 수행하기 때문에 context switch를 발생시키지 않는다.)
- 경제성 (Economy)
- 새로운 프로세스의 생성하거나, context switch에 비해 효율적
- 멀티 프로세서 (multi-processor) 활용
- 병렬 처리를 통해 성능 향상 (스레드가 여러 개라는 것은 여러 개의 CPU 코어를 동시에 사용한다는 의미이다.)
FPS 게임을 한다고 가정해보자. 게임을 하면 모니터에서 게임 화면을 보여주고 마우스와 키보드를 통해 캐릭터를 조작하고 총을 발사해야 한다. 또한 스피커를 통해 소리를 듣고 마이크를 통해 팀원에게 명령을 전달해야 한다.
만약 단일 스레드라면 내가 마우스를 움직이는 동안 모니터 화면이 잠시 멈추어야 한다. 혹은 마이크를 통해 대화를 하면 화면도 안나오고 마우스도 동작하지 않게 된다. 즉, 하나의 작업을 하는 동안 다른 작업은 수행을 할 수 없게 된다.
이를 해결하려면 스레드를 3개를 만들어서 하나는 화면 출력, 하나는 사용자 입력, 하나는 스피커/마이크를 담당하게 해주면 된다. 또한 스레드이기 때문에 게임을 하기 위한 자원들은 공유되게 된다.
일부 스레드의 처리가 지연되더라도(ex. 마우스 클릭으로 인해 총 발사 지연), 마이크를 통해 대화하는 것은 가능하다. 즉 사용자 응답성(responsiveness)을 높이는 장점이 있다.
사용자 수준 스레드 (User Thread)
- 사용자 영역의 스레드 라이브러리로 구현 됨
- 라이브러리가 스레드의 생성, 스케줄링 등을 담당한다.
- POSIX threads, Win32 threads, Java thread API 등
- 커널은 스레드의 존재를 모름
- 장점
- 커널의 관리(개입)를 받지 않음
- 생성 및 관리의 부하가 적음, 유연한 관리 가능
- 이식성(Portability)이 높음 (라이브러리만 있다면 해당 프로그램을 사용할 수 있다.)
- 커널의 관리(개입)를 받지 않음
- 단점
- 커널은 프로세스 단위로 자원 할당
- 하나의 스레드가 block 상태가 되면, 모든 스레드가 대기 (single-threaded kernel의 경우)
- ex) S1 스레드가 block이 되면 프로세스 P1이 block 상태가 되므로, S2, S3 스레드들은 작업을 할 수 있어도 모두 block 상태가 되어야 한다. (이유 : 커널은 프로세스 단위로 자원 할당되기 때문)
- 커널은 프로세스 단위로 자원 할당
- 장점
프로세스가 하나 생성되면 커널 수준의 스레드가 하나 만들어지게 된다.
또한 프로세스 내부를 보연 스레드 라이브러리를 통해 여러 개의 스레드(사용자 수준 스레드)를 사용하는 것처럼 동작하게 된다.
이때, 사용자 수준 스레드들은 스레드 라이브러리 레벨에서 만든 스레드이므로 스레드 라이브러리에서 관리를 하게 되고, 사용자 수준 스레드들을 관리하기 위한 정보들이 들어있는 스레드 제어 블록(Thread Control Block)이 스레드 라이브러리 안에 생성되게 된다.
사용자 수준 스레드는 여러 개이지만 커널 수준 스레드는 하나이므로 다대일 매핑이 되게 된다.
커널 수준 스레드 (Kernel Threads)
- OS(kernel)가 직접 관리
- 단점
- 커널 영역에서 스레드의 생성, 관리 수행
- Context switching 등 부하(Overhead)가 큼
- 커널 영역에서 스레드의 생성, 관리 수행
- 장점
- 커널이 각 스레드를 개별적으로 관리
- 프로세스 내 스레드들이 병행 수행 가능
- 하나의 스레드가 block 상태가 되어도, 다른 스레드는 계속 작업 수행 가능
- ex) S1 스레드가 block이 되어도, 다른 S2, S3 스레드들은 계속 작업을 수행할 수 있다.
- 프로세스 내 스레드들이 병행 수행 가능
- 커널이 각 스레드를 개별적으로 관리
사용자 수준 스레드가 만들어지면 그에 맞춰 같은 갯수의 커널 수준 스레드가 만들어지게 된다(1대1 매핑).
스레드를 관리하는 것도 커널 레벨로 내려오게 된다. 즉, 커널 안에 제어 요소들이 여러개 생기고 관리도 커널이 하게 되는 것이다. 커널이 직접 관리를 하기 때문에 부하(overhead)가 크다는 단점이 있다.
Multi-Threading Model
- 다대일(n:1) 모델
- 사용자 수준 스레드
- 일대일(1:1) 모델
- 커널 수준 스레드
- 다대다(n:m) 모델
- 사용자 수준 스레드와 커널 수준 스레드를 여러 개 사용하는 모델
- n > m
- 혼합형 스레드
혼합형 (n : m) 스레드
- n개의 사용자 수준 스레드와 m 개의 커널 스레드를 사용 (n > m)
- 사용자는 원하는 수 만큼 스레드 사용
- 커널 스레드는 자신에게 할당된 하나의 사용자 스레드가 block 상태가 되어도, 다른 스레드 수행 가능
- 병행 처리 가능
- 효율적이면서도 유연하다.(사용자 수준 스레드와 커널 수준 스레드의 장점을 동시에 취함)
사용자 영역에서는 원하는 만큼 사용자 수준 스레드를 생성하고, 커널 영역에서는 사용자 수준 스레드만큼은 아니지만 다수의 커널 수준 스레드를 생성한다.
이때 사용자 영역 스레드와 커널 영역 스레드가 다대다 매핑(3:2, 3:3)이 이루어진다.
사용자는 사용자 영역 스레드처럼 자신이 원하는 만큼의 스레드를 사용하고 스레드 라이브러리에서 관리한다.
커널 영역에서는 사용자 영역 스레드보다는 적은 스레드가 있지만 사용자 수준 스레드에게 동적으로 자원을 할당해줘서 하나의 스레드가 block이 되더라도 다른 스레드가 동작할 수 있도록 만들어준다.
하드웨어 영역에서 프로세서들은 커널 수준 스레드들과 매핑이 되게 된다.
실제 OS들은 당연히 혼합형 스레드 모델들을 사용한다.
'Study > 운영체제' 카테고리의 다른 글
5. 프로세스 스케줄링 (2) - FCFS, RR (0) | 2023.11.08 |
---|---|
5. 프로세스 스케줄링 (1) (0) | 2023.11.06 |
3. 프로세스 관리 (2) (0) | 2023.11.03 |
운영체제 3. 프로세스 관리 (1) (0) | 2023.11.02 |
2. 운영체제 개요 (3) (0) | 2023.11.02 |