오퍼레이팅 시스템 [9] - Thread와 동기화
‘Thread 개념의 등장과 이에따른 동기화의 필요성’
Process 와 Thread
- Process : 실행중인 프로그램
- 자원소유의 단위
- Scheduling(실행) 단위
우리는 지금까지 Process가 하나의 실행 sequence만 있다고 가정해왔다.
- Example) Busy Web server에서 Multithread가 등장한 배경
Traditional Single-Threaded Process : 한번에 한명의 고객만 담당가능
-> Multi-processing solution : 고객이 많아져 프로세스가 많아지자 생성, context-switching, 프로세스간 통신에 드는 Overhead 증가
-> Multi-Threading solution : Overhead가 적은 Multithread 등장
Multithreading
- 모든 현대 OS는 하나의 Process에 다중의 Thread를 제공한다.
- 단일 프로세스 내부에서도 실행단위로 Thread(lightweight Process)로 나뉜다.
- Concurrent(동시성, 병행성)한 다중의 실행단위로 나뉘는 것.
Single Thread와 Multi Thread
- 이때 같은 Process이므로 Thread는 같은 Code, Data, Files 등 자원을 공유한다. 하지만 같이 실행되지는 않는다.
Concurrency
- Multithreaded Process는 Overhead가 더 발생하는 다중 Process의 실행없이도 Concurrency(동시성)를 가능하게했다.
- Interleaving기법
- 하나의 CORE로 여러 Thread를 번갈아가며 실행하여 병렬적으로 처리되는것과 같은 효과를 내는것. Concurrent하지만 Parallel하지는 않다.
- Overlapping기법
- 여러개의 CORE로 동시에 여러 Thread를 병렬처리한다. Conccurent, Parallel하다.
Uniprocessor에서의 Multithreading 예시
위 예시에서
Thread A
의 Time quantum이 종료된후에Thread B,C
가 모두 준비된상태임에도Thread C
가 실행된것은 Scheduling방법에 따른것이다.Multithreading의 장점
- 새로운 프로세스를 만드는것이 아니므로 새로운 PCB전체를 만들 필요가 없다.
- 프로세스보다 Thread간 Switch가 더 빠르다.
- Thread간 자원을 공유한다.
- 프로세스간 상호작용은 자원 보호를 위해 Kernel영역에서 이루어져야하는 반면, Thread는 같은 메모리를 사용하므로 User레벨에서 가능하다.
- Cache의 오염이 덜하다.
- Single-Core 보다 Multi-Core에서 더 큰 장점을 갖는다.
- 하나의 프로세스가 여러 Thread로 이루어져 있으므로, 하나의 프로세스가 다중 CPU에서 실행될 수 있다.
Multicore 환경에서의 Multithreading
- 많은 시스템에서 사용되는 Multicore, Multithread 시스템은 무조건적으로 Thread가 많다고 성능이 좋아지진않는다.
- 아래는 행렬곱셈과 Fast Fourier transform 를 처리할때 Thread개수에 따른 성능을 계산한 그래프이다.
16 processor 환경에서의 thread 개수에 따른 성능
2개의 프로세스(행렬곱, FFT)가 실행되고 있으므로 프로세스당 8개의 Thread로 나뉘어져 총 8*2=16개의 Thread가 모든 프로세서를 활용하고 있을때 가장 효율이 높다.
그 이상은 Overhead(switch, rescheduling, preemption, cache오염 등)으로 인해 효율이 떨어진다.
Multithread Model
- Thread들은 같은 자원을 공유하지만, Memory상에 Execution Stack을 각자 갖고있다. (User, Kernel stack)
- TCB(Thread Control Block)
- 각 Thread가 갖고있는 레지스터값, Scheduling 정보 현재 State등을 저장하는 역할로 PCB와 비슷하다.
- 새로운 Proecss를 생성할때는(
fork()
) PCB부터 DATA, Stack, CODE등 모든 메모리영역을 할당해 줘야하지만, 새로운 Thread를 생성할때는(pthread_create()
) Stack과 TCB만 만들어주면 된다. 비용감소!
- Thread는 2가지의 카테고리로 나눌수 있다.
ULT와 KLT
ULTs
User Level Thread
- 모든 Thread 관리가 유저 프로그램 즉, Application에서 이루어진다.
- User Space에 존재하는 Thread library에 의해 Thread가 만들어진다.
- Thread library에는 Thread 생성, 삭제와 Thread간 소통과 Data공유 등의 코드가 들어있다.
- Thread Switch가 User Space에서 이루어진다
- Thread Library에 의해 Schedule, TCB저장, 불러오기가 이루어진다.
- Kernel은 개입하지않는다!
- 장점
- Mode Switch없이 Thread Switch가 가능하다.
- 어떤 OS에서도 적용가능하다.
- 단점
- MultiCore 확장성이 없다. : OS는 하나의 프로세스로만 생각하므로 Thread를 코어에 각각 부여하지 못한다.
- 병렬처리가 불가능하다. : 커널이 하나의 Thread만 Schedule 가능하므로
- 하나의 Thread만 Block(System call)되면, 전체 Thread가 Block된다.
KLTs
Kernel Level Thread
- 모든 Thread관리가 Kernel 영역에서 이루어진다.
유저프로그램에서는 어떤 Thread 관리도 불가능함
- 장점
- 코어당 하나의 Thread를 할당할 수 있어 Parallel하게 실행가능하다.
- 하나의 Thread가 Block되어도 다른 Thread는 실행가능하다.
- 단점
- Thread Switch를 위해서는 Mode Switch가 필수적이다. -> Overhead증가
- Combined ULT/KLT
- 두 모드를 같이 사용하여 각각의 문제점을 보완한다.
- 하지만 구현 복잡도가 매우 증가한다.
Thread 동기화
- Thread의 자원을 공유하는 특성으로 인해 같은 자원에 동시에 접근하게 되는 Race Condition등의 문제가 발생한다.
- Synchoronization(동기화) : 다수의 Thread가 공유자원사용 혹은 실행될때 잘못된 결과가 나오지않게 조정하는 것.