Multi-Processing
앞에 글에서 Multi-tasking은 1개의 CPU만으로 여러 task를 동시에 실행하는 것 같은 환상을 줄 수 있다고 했습니다.
이를 "동시성(concurrency)"라고 했습니다.
2023.12.10 - [CS] - [OS] Multi-Programming, Multi-Tasking
[OS] Multi-Programming, Multi-Tasking
Multi Programming 과거에는 컴퓨터라는 것이 굉장히 특별한 용도로 사용이 돼서 하나의 프로그램만 실행할 수 있었습니다. 하지만 이 방식은 CPU가 노는 시간이 많았기 때문에 CPU 이용률을 높이기 위
sejineer.tistory.com
이때 2개 이상의 CPU를 사용하는 것을 Multi-Processing이라고 합니다.
동시성과 달리 실제로 동시에 실행되며 이를 "병렬성(parallelism)"이라고 합니다.
대기열에 있는 task는 context switch로 CPU를 배정받을 때 이전과 다른 CPU를 배정받을 수 있습니다.
(참고: CPU pinning 또는 Processor affinity → 특정 task가 언제나 같은 특정 CPU를 배정받게 하는 것)
동시성(Concurrency) vs 병렬성(Parallelism) 비교
Multi-Threading
멀티 스레딩에 들어가기 전 Thread에 대해서 알고 가겠습니다.
스레드(Thread)
스레드를 한글로 번역하면 실입니다.
스레드라고 얘기하면 용어가 이해가 안 된다고 생각할 수 있습니다.
이 스레드는 쭉 흐름이 있는 것처럼 독립된 코드의 실행 흐름을 나타내는 것이 스레드입니다.
코드를 실행할 때 매번 관리하면서 하기가 어려우니까 이것만 쭉 실행하는 것처럼 하고 다른 것을 할 때는 다른 것만 쭉 실행하는 것처럼 만들어 줄 거다라는 것입니다. 각각의 실처럼 쭉 이어지는 걸로 생각을 하게끔 해서 하나의 프로세스 안에서 동시성하고 병렬성을 개선할 수 있습니다. 동시성을 개선한다는 얘기는 이 스레드 자체가 CPU를 할당받는 것입니다.
이때 CPU가 여러 개면 스레드 a, 스레드 b 각각 둘 다 비율을 차지해 프로그램은 하나지만 두 개를 동시에 할 수 있습니다.
각 스레드는 독립된 ①프로그램 카운터, ②CPU registers, ③Stack을 가집니다.
그래서 스레드 간에서는 ①코드 영역, ②데이터 영역, ③파일/소켓 등의 OS 자원을 공유합니다.
프로세스는 모든 것이 독립적으로 할당되지만 스레드는 독립적으로 할당되어야 되는 것은 아니기 때문에
"Lightweight process"라고 불리기도 합니다.
싱글 스레드 vs 멀티 스레드
스레드의 구현 방식
스레드의 관리(= 생성/소멸)와 스케쥴링, 콘텍스트 스위칭 방식에 따라 두 가지 방식이 있습니다.
- 유저 레벨(User level)
- 예: co-routine
- 커널 레벨(Kernel level)
- 예: Windows, Linux
예를 들어 강사가 수강생들한테 간식 사 먹으라고 10만원을 줍니다.
User Level은 이 10만원을 수강생들이 알아서 하는 것입니다.
Kernel Level은 강사가 직접 수강생한테 나눠주는 것입니다.
유저 레벨 스레드
- 스레드의 ①생성/소멸 관리, ②스케쥴링, ③콘텍스트 스위칭을 유저 레벨의 라이브러리에서 구현합니다.
- Kernel은 이에 대한 정보를 전혀 갖지 않고 Process 단위로 스케쥴링합니다.
- CPU를 할당받으면 process 내 thread library가 실행할 유저 thread를 선정하고 실행될 thread의
상태를 복구해 줍니다. (= 유저 레벨의 콘텍스트 스위칭)
장점
- 스레드 생성/소멸, 스위칭에 커널이 개입하지 않으므로 빠릅니다.
- 참고: 커널이 개입하는 작업(= system call 호출은)은 느립니다.
- 스레드 스케쥴링 알고리즘을 process가 제어할 수 있습니다.
- OS에 독립적으로 구현할 수 있습니다.
단점
- 어느 한 스레드가 blocking 되면 process 전체가 blocking 됩니다.
- 커널 상에서는 하나의 스레드로만 존재하므로 멀티프로세싱의 병렬성 혜택을 볼 수 없습니다.
커널 레벨 스레드
- 스레드의 ①생성/소멸 관리, ②스케쥴링, ③콘텍스트 스위칭을 커널이 관리
- 커널이 스레드별로 CPU 큐에 넣고, 콘텍스트 스위칭 역시 스레드별로 복구해 줍니다.
장점
- 스레드별로 CPU를 할당하므로, 멀티프로세싱 환경에서 동시에 여러 CPU를 쓸 수 있다.(= 병렬성)
- 프로세스 내에서 한 스레드가 blocking 되어도 다른 스레드는 계속 동작한다.
단점
- 스레드의 생성/소멸에 커널이 관여하므로 느리다.
- 스레드 간 스위칭 역시 커널이 관리하므로 느리다.
- 스레드 구현이 OS 의존적이다.
'CS' 카테고리의 다른 글
[Network] HTTP 1.1, 2.0 (0) | 2023.12.12 |
---|---|
[OS] C++의 Thread (1) | 2023.12.12 |
[OS] Multi-Programming, Multi-Tasking (0) | 2023.12.10 |
[OS] CPU utilization, CPU load (1) | 2023.12.10 |
[Network] Socket Options, I/O Multiplexing과 Non-blocking I/O (1) | 2023.10.23 |