Quick Comparison
CPU가 실제로 schedule하는 실행 흐름은 thread입니다. process는 메모리와 자원의 경계이고 thread는 그 안에서 명령이 진행되는 경계입니다.
| 기준 | Process | 같은 Process의 Thread |
|---|---|---|
| 주소 공간 | 기본적으로 분리 | code, global data, heap을 공유 |
| 실행 상태 | 하나 이상의 thread 포함 | register, instruction pointer, stack이 개별 |
| 통신 | IPC 필요 | 공유 메모리에 직접 접근 가능 |
| 실패 격리 | 상대적으로 강함 | 잘못된 메모리 접근이 process 전체에 영향 |
공유와 개별 상태
같은 process의 thread는 실행 코드, global/static data, heap object, 열린 handle 같은 process 자원을 공유할 수 있습니다. 각 thread는 자신의 register 상태와 instruction pointer, 호출 stack을 가져 독립적으로 함수 흐름을 진행합니다.
thread마다 stack이 필요한 이유는 함수 호출 frame, 반환 위치, 지역 실행 상태가 서로 섞이면 독립된 실행 흐름을 유지할 수 없기 때문입니다.
선택 기준
강한 격리와 독립 배포·재시작이 중요하면 process 경계를 먼저 검토합니다. 같은 상태를 낮은 비용으로 자주 공유해야 하면 thread가 유리할 수 있지만, race condition과 synchronization 비용을 감수해야 합니다.
여러 process가 무조건 느리고 여러 thread가 무조건 빠르다고 단정하지 않습니다. 작업 크기, 통신량, isolation, scheduler, memory locality가 실제 비용을 결정합니다.
자주 틀리는 점
- thread가 heap 전체를 각자 복사한다고 생각하지 않습니다.
- 다른 process의 같은 가상 주소가 같은 물리 데이터를 뜻하지 않습니다.
- thread 수를 core 수와 같게 고정하는 규칙은 I/O 대기와 작업 특성을 무시합니다.
- thread handle을 닫는 것과 thread 실행을 종료하는 것을 구분합니다.
참고 링크
2 sources