- OS란?
- OS Structure
- Process
- Process Scheduling
- Thread Concurrency
- Synchronization Tools
4. Thread Concurrency
Multithreaded Process Models
Multicore or Multiprocessor 프로그래밍이 가능해지면서 할 일을 어떻게 나누지? 에 대한 문제 발생
→ 할 일 나누기, 밸런스, 데이터 나누기, 데이터 의존성, 테스팅과 디버깅 등...
- Parallelism(병렬성) : 둘 이상의 작업을 동시에 수행 가능하고 멀티 코어(책상이 여러개)
- Concurrency(동시성) : 둘 이상의 작업을 동시에 수행 하지만 코어는 1개(하나의 책상을 나눠씀)
Threads Implementation: User Threads and Kernel Threads
1) User Level Threads
- Kernel은 1개(심지어 유저 레벨이 쓰레드로 되어있다는 것을 모름), User-level만 thread
- userlevel threads library를 통해 모든 쓰레드를 application이 관리
- userlevel 내에서 할 일을 나눔
- userlevel threads library는 어떤 유저 레벨 쓰레드가 Kernel을 차지할 것인지 스케쥴링함
- thread switching이 커널 단위을 포함하지 않음. 즉, mode switching이 아님
- 문제점 : P0 안에 있는 쓰레드 1이 I/O를 요청 -> 커널은 쓰레드의 존재를 모르기 때문에 P0 자체를 blocked 됨
2) Kernel Level Threads
- Kernel level threads와 user level threads 둘 다 존재. 1:1 매핑
- 커널은 user level threads의 존재를 앎
- userlevel threads library는 없고, System call API & Kernel function for thread facility가 쓰레드들을 관리
ex) thread switching, scheduling threads
- blocking이 process가 아니라 thread 단위임
- 동일 프로세스에서 스레드 전환 시 커널도 같이 전환해야 하므로 속도가 느려질 수 있음
3) Combined Threads
- 유저가 쓰레드를 만들면 커널에서도 적당히 쓰레드를 만들어서 매핑 시킴
- 유저 10만 명이 쓰레드를 만들면 커널도 10만 개를 만들어야하는 1:1 매핑의 단점을 보완하여 만들어짐.
- 유저 쓰레드 > 커널 쓰레드
- 우선 순위에 따라 어떤 유저 쓰레드가 커널 쓰레드에 매핑될 지 결정 -> 스케쥴링
- User-Level threads library(어떤 유저 레벨 쓰레드를 커널 쓰레드에 매핑할 것인지에 대해 스케쥴링, context switching, thread 간 소통)와 System call API & kernel thread facility(어떤 커널 쓰레드를 코어에 할당할 것인지에 대해 스케쥴링, 유저레벨-커널레벨 간 매핑 담당, threads간 switching) 둘 다 존재! 하는 일은 비슷하지만 조금 다름.
- 프로그래머가 대충 커널 쓰레드를 몇 개 만들 것인지 알려주어야함.
Thread Libraries
- PThreads : Linux
- OpneMP : C, CPP
-> #pragma omp parallel (for)