Concurrency
동시성을 구현하는 두 가지 방식이 있다.
✅Option1 : 프로세스 기반 동시성
- 장점) 추상화가 필요 없다. OS가 제공하는 프로세스만으로도 구현이 가능하다.
- 단점) 통신 오버헤드가 크고, 문맥 전환 비용이 크다. (왜냐하면 프로세스는 독립된 메모리 공간을 가지기 때문에 스위칭을 할 때 레지스터 저장 및 복구, 메모리 매핑 전환 등이 발생하기 때문이다.)
✅Option2 : 스레드 기반 동시성
- 장점) 가볍고, 데이터 공유가 쉽다. (메모리를 직접 공유하기 때문이다.)
- 단점) 동기화 문제가 발생할 수 있다.
Multi-threaded program
그렇다면 멀티스레드를 가지고 있는 프로그램들은 어떤 구조로 이루어져 있을까.
- Producer/consumer
: 데이터를 만들어내는 생성자 스레드를 Producer라고 하고, 생성된 데이터를 소비하는 소비자를 Consumer라고 한다.
- Pipleline
: 하나의 큰 작업을 여러 단계로 쪼개는 것을 의미한다. 각 작업(A, B, C)을 별도의 스레드가 처리하고, 복잡해지면 B'도 생길 수 있다.
- Defer work with background thread
: 중요하지 않은 작업은 백그라운드에서 처리한다. 리소스가 남을 때 돌아도 되는 별도의 스레드이다.

그림을 통해 멀티 CPU 환경에서 스레드가 실행될 때 어떤 자원을 공유하고 어떤 건 개별적으로 가져가야 하는지 알아보자.
[그림 설명]
- 버스로 연결된 CPU 2개가 있고, 그 버스에 RAM도 연결되어 있다.
- 2개의 CPU안에 각각 스레드가 하나씩 돌아가고 있고, 각각의 PTBR은 서로 다른 Page Directory를 가리키고 있다.
- 가상 주소의 위치가 같다고 가정한다.
우선, CPU는 IP, SP와 같은 레지스터를 공유하지 않는다.
왜냐하면 각각의 스레드는 다른 실행 위치(IP)와 다른 스택 프레임(SP)을 가지고 있기 때문이다.
(보통 Heap까지는 공유할 수 있어도 Stack은 공유하지 않는다고 한다.)
→ Stack은 반드시 분리해야 하는 이유는 각 스레드가 자신만의 함수 호출 흐름과 지역 변수 공간을 가져야 하기 때문이다.
정리해보면 공유할 수 있는 건 다음과 같다.
- PID: 하나의 프로세스 안에 있는 스레드들은 동일한 프로세스이기 때문이다.
- 주소 공간: 즉, Code와 Heap 공유가 가능하다.
- 파일 티스크립터
- 프로세스를 실행한 유저의 아이디
반대로, 스레드가 각자 가지고 있는 것은 다음과 같다.
- TID: 각각의 스레드는 아이디를 가진다.
- PC, SP 등 레지스터
- 지역 변수 및 반환 주소
그래서 이런 걸 따로 관리할 API가 존재한다.
OS Support
운영체제 스레드를 지원하는 방식 두 가지에 대해 알아보자.
✅Approach1 : User-level threads
- 관리를 각 프로세스가 직접 한다.
- OS가 볼 때는 스레드가 있다는 사실을 모른다. (그냥 프로세스 하나만 있는 것으로 안다.)
- 컨텍스트 스위칭을 프로세스 단위로 하게 된다.
- 장점) OS의 지원이 필요 없기 때문에 이식성이 좋다.
또한 시스템 콜이 없으므로 스레드 연산 오버헤드가 낮다.
- 단점) 멀티프로세서 활용이 불가하다. 왜냐하면 하나의 스레드가 I/O 작업을 해서 Block되면 프로세스 전체가 멈춰야 되기 때문이다.
✅Approach2 : Kernel-level threads
- OS가 직접 스레드를 인식하고 관리한다.
- 커널 스레드가 각각 스케줄링을 받아 담당한다.
- 장점) 멀티프로세스 활용이 가능하다. (각 커널 스레드를 다른 CPU에서 병렬 실행)
하나의 프로세스가 Block 되더라도 다른 스레드는 계속 실행 가능하다.
- 단점) 프로세스는 하나인데 스레드를 여러 개 관리하니까 오버헤드가 발생한다.
또한, 스레드가 많아질수록 OS가 관리해야 할 대상이 늘어난다.
⇒ 딱 반대라고 볼 수 있다.
현재 많이 쓰이고 있는 것은 커널 레벨 스레드라고 한다.
'3-2 학기 > Operating Systems' 카테고리의 다른 글
| [운영체제] Virtual Memory (0) | 2025.09.30 |
|---|---|
| [운영체제] Segmentation, Paging (0) | 2025.09.29 |
| [운영체제] Multiprocessor Scheduling (0) | 2025.09.17 |
| [운영체제] Scheduling (0) | 2025.09.16 |
| [운영체제] Limited Direct Execution (0) | 2025.09.13 |