Thread
스레드는 프로세스 내에서 실행되는 흐름의 단위이자, CPU 스케줄링의 기본 단위다.
- 과거의 운영체제에서는 프로세스 하나가 하나의 실행 흐름을 가짐
- 현대 운영체제에서는 하나의 프로세스가 여러 개의 스레드를 가져 멀티스레딩(Multithreading) 지원
스레드의 메모리 구조
Section titled “스레드의 메모리 구조”스레드의 가장 큰 특징은 프로세스 내의 자원을 공유하여 효율적인 자원 관리와 데이터 통신을 가능하게 하지만, 동기화 문제를 유발하는 원인이 되기도 한다.
자원 공유 방식
Section titled “자원 공유 방식”- 공유 영역: Code, Data, Heap 영역은 프로세스 내 모든 스레드가 공유
- 파일 디스크립터(열린 파일 목록)나 전역 변수 등을 손쉽게 공유 가능
- 독립 영역: Stack, PC(Program Counter), 레지스터(Register)는 스레드마다 독립적으로 할당
- 각 스레드가 독립적인 함수 호출과 실행 흐름을 가지기 위함
graph TB subgraph Process [프로세스 메모리 공간] direction TB subgraph Shared [공유 자원] Code[Code 영역] Data[Data 영역] Heap[Heap 영역] end
subgraph Threads [스레드 실행 흐름] direction LR subgraph T1 [스레드 A] Stack1[Stack] Reg1[PC / Register] end subgraph T2 [스레드 B] Stack2[Stack] Reg2[PC / Register] end subgraph T3 [스레드 C] Stack3[Stack] Reg3[PC / Register] end end end프로세스 vs 스레드
Section titled “프로세스 vs 스레드”프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 그 자원을 활용하는 실행의 단위다.
| 구분 | 프로세스(Process) | 스레드(Thread) |
|---|---|---|
| 정의 | 실행 중인 프로그램(자원 할당의 단위) | 프로세스 안의 실행 흐름(스케줄링의 단위) |
| 메모리 | 독립된 메모리 영역(Code, Data, Heap, Stack) | Stack만 독립, 나머지는 프로세스 내 공유 |
| 통신 비용 | 높음(IPC 필요: 파이프, 소켓 등) | 낮음(공유 메모리(Data, Heap) 직접 접근) |
| 문맥 교환 | 오버헤드 큼(캐시 초기화 등 비용 높음) | 오버헤드 작음(메모리 공유로 캐시 적중률 높음) |
| 안정성 | 한 프로세스 종료가 다른 프로세스에 영향 없음 | 한 스레드의 오류가 프로세스 전체를 종료시킬 수 있음 |
멀티 프로세스 vs 멀티 스레드
Section titled “멀티 프로세스 vs 멀티 스레드”- 멀티 프로세스(Multi-Process): 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업 수행(예: 크롬 브라우저의 각 탭)
- 장점
- 독립된 구조로 인해 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않아 높은 안정성 제공
- 단점
- 문맥 교환(Context Switch) 과정에서 캐시 메모리 초기화 등 무거운 작업이 필요해 오버헤드 발생
- 프로세스 간 통신(IPC)을 위해 복잡한 기법(파이프, 소켓 등)을 사용해야 하므로 통신 비용이 높음
- 장점
- 멀티 스레드(Multi-Thread): 하나의 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 작업 수행(예: 웹 서버 요청마다 각 스레드가 처리)
- 장점
- 힙 영역 등을 통해 데이터를 직접 공유하므로 통신 방법이 간단하고 통신 비용이 낮음
- 문맥 교환 시 스택 영역 등 일부만 저장/복구하면 되어 오버헤드가 적음
- 단점
- 여러 스레드가 공유 자원에 동시에 접근 시 데이터 정합성 문제 발생 가능
- 하나의 스레드에서의 치명적인 오류가 프로세스 전체에 영향을 미칠 수 있음
- 장점