Thread
: CPU 이용의 기본 단위. process보다 가벼운 개념이다.
Thread의 구성요소
thread는 같은 process에 속한 다른 thread와
code, data section, OS resources(open files, signal 등)을 공유한다.
process는 하나의 제어 thread를 갖고 있다.
process가 thread를 나누지 않고, 그냥 그 자체로 하나의 thread인 경우를
중량 프로세스(heavyweight process)
라고 한다.
만약 process가 multi thread를 가진다면, process는 동시에 하나 이상의 작업을 수행할 수 있다.
중량 프로세스에서 context switching : process switching
경량 프로세스에서 context switching : CPU switching, thread context switching
현대의 컴퓨터와 모바일 기기에서 작동하는 거의 모든 SW 응용들은
Multithread를 이용한다.
마트 계산대의 구조가 윗그림, 아랫그림이 있다고 가정하자.
윗그림
은 점원이 손님의 계산을 직렬로 순차적으로 처리하고.
아랫그림
은 점원이 돌아다니며 손님의 계산을 돌아가면서 처리한다.
손님의 줄: thread / 점원 : CPU 라고 생각해보자.
처리시간 = 대기시간 + 작업시간
윗그림과 아랫그림에서의 평균 처리시간을 비교해보자.
윗그림의 평균 처리시간
(10 + (10 + 5) + (10 + 5 + 2) + .. + (10 + 5 + 2 + 8 + 1)) / 5
= (10 + 15 + 17 + 25 + 26) / 5
= 93 / 5
= 18.6
아랫그림의 평균 처리시간
= (5 + 8 + 17 + 24 + 26) / 5
= 80 / 5
= 16
윗그림의 평균 처리시간(18.6) > 아랫그림의 평균 처리시간(16)
multithread가 더욱 효과적이라는 결론을 내릴 수 있다.
Parellelism
:
“하나 이상의 Task를 물리적으로 동시에 처리할 수 있다.” 라는 의미(진짜 동시에)
core가 2개 이상 있어야 함. 병렬처리로 인해 더욱 효율적이다.
Concurrency
:
“하나 이상의 Task가 함께 있으나 독립적으로 번갈아 가며 진행되고 있다.”(진짜 동시는 아님)
그렇다면 Core가 많아질수록 빨라지는가?
→ 그것은 아니다. (Amdahl’s Law 으로 증명)
Amdahl’s Law
:example
speedup times?
➡️ 1 / (25 + 75/1) = 1/100 → 1 / (25 + 75/2) = 1 / (62.5)
➡️ 100 / 62.5 = 1.6
➡️ core를 1개에서 2개로 늘렸더니, 1.6배 빨라졌다.
("병렬처리를 안했다") == (S = 1)
➡️ speedup ≤ 1 / (1 + 0/1) = 1
➡️ 최대 1배 빨라짐
("100% 병렬처리 했다") == (S = 0)
➡️ speedup ≤ 1 / (0 + 1/N) = N
➡️ 최대 N배 빨라짐 (Core 개수가 N개라면, N배 빨라진다)
하지만 과연 그럴까?
Amdahl's Law의 숨은 의미
:
이론적으로 100% 병렬로 처리하면,
과연 core가 n개일 때, n배만큼 빨라진다고 할 수 있을까?
알 수 있는 사실은 병렬처리를 최대로(95%까지) 늘려도 성능 개선은 최대 20배까지가 한계임을 알 수 있다.
Amdahl’s Law의 숨은 의미
병렬처리를 할 수 있는 최선(95%)까지 하고 Core개수를 무한으로 늘려봐도,
성능 개선은 최대 20배까지이다.
더 이상 개선을 못한다는 사실도 내포하고 있기 때문에Amdahl의 저주
라고도 불린다.
User Threads
: Library에 의해 thread 형태로 만들어져Kernel Threads
: OS에 의해 직접 지원되고 관리되며궁극적으로 User Threads는 나중에 Kernel Threads와 결합하여 동작하기 때문에
User Threads와 Kernel Threads의 연관 관계를 확립하는 4가지 일반적인 model이 있다.
Many-to-one model == User-to-kernel model
:One-to-one model
:Many-to-many model
:Two-level model
:Thread Library
:
프로그래머들에게 thread를 생성하고, 관리하기 위한 API를 제공한다.
현재 세 종류 Library가 주로 사용된다.