Process vs. Thread vs. Coroutine
Process, Thread, Coroutine은 모두 프로그램 실행의 단위이지만, 각각 다른 특성과 용도를 가지고 있다.
Process:
- 독립적인 실행 단위로, 자체 메모리 공간과 시스템 자원을 가진다.
- 다른 프로세스와 완전히 격리되어 있어 안정성이 높다.
- 생성과 전환에 많은 비용이 든다.
Thread:
- 프로세스 내부의 실행 단위로, 같은 프로세스의 다른 스레드와 메모리를 공유한다.
- 프로세스보다 가볍고, 생성과 전환 비용이 적다.
- 동시성을 제공하지만, 동기화 문제에 주의해야 한다.
Coroutine:
- 경량 스레드라고도 불리며, 스레드 내에서 실행되는 협력적 멀티태스킹 단위.
- 매우 가볍고, 생성과 전환 비용이 매우 적다.
- 비동기 프로그래밍을 단순화하고, 동시성을 효율적으로 관리한다.
Process, Thread, Coroutine의 관계는 다음과 같이 계층적으로 표현할 수 있다:CPU > Core > Process > Thread > Coroutine
- 프로세스는 독립적인 메모리 공간을 가지며, 하나 이상의 스레드를 포함한다.
- 스레드는 프로세스 내에서 실행되며, 같은 프로세스의 메모리를 공유한다.
- 코루틴은 스레드 내에서 실행되는 더 가벼운 실행 단위이다.
이 구조는 각 단위의 특성과 리소스 사용을 잘 보여준다.
프로세스가 가장 무겁고, 코루틴이 가장 가벼운 실행 단위이다.
Process vs. Thread vs. Coroutine 비교
특성 | Process | Thread | Coroutine |
---|---|---|---|
정의 | 독립적인 실행 단위로 자체 메모리 공간 보유 | 프로세스 내의 실행 단위로 메모리 공유 | 협력적 멀티태스킹을 위한 서브루틴 |
메모리 공유 | 독립적인 메모리 공간 | 같은 프로세스의 메모리 공유 | 같은 스레드의 메모리 공유 |
컨텍스트 스위칭 비용 | 매우 높음 | 중간 | 매우 낮음 |
생성/소멸 비용 | 높음 | 중간 | 낮음 |
자원 사용 | 많음 | 중간 | 적음 |
통신 방식 | IPC (파이프, 소켓 등) | 공유 메모리, 뮤텍스 | yield/await |
병렬 처리 | 실제 병렬 처리 가능 | 실제 병렬 처리 가능 | 동시성만 제공 (병렬x) |
적합한 작업 | CPU 집약적 작업 | I/O + CPU 혼합 작업 | I/O 집약적 작업 |
에러 영향 | 다른 프로세스에 영향 없음 | 같은 프로세스의 스레드들에 영향 | 명시적 에러 처리 필요 |
디버깅 난이도 | 쉬움 | 어려움 | 중간 |
확장성 | 높음 (여러 CPU 코어) | 중간 | 단일 스레드 내 제한 |
메모리 격리 | 완전 격리 | 부분 공유 | 공유 |
실행 모델 비교
실행 모델 | Process | Thread | Coroutine |
---|---|---|---|
스케줄링 주체 | OS | OS | 프로그램 |
선점 여부 | 선점형 | 선점형 | 비선점형 |
컨텍스트 스위치 | OS 레벨 | OS 레벨 | 사용자 레벨 |
동시성 모델 | 진정한 병렬성 | 진정한 병렬성 | 협력적 멀티태스킹 |
리소스 사용 비교
리소스 | Process | Thread | Coroutine |
---|---|---|---|
메모리 사용량 | 높음 (독립 메모리) | 중간 (공유 메모리) | 낮음 (최소 오버헤드) |
CPU 사용 | 높음 | 중간 | 낮음 |
시스템 리소스 | 많음 | 중간 | 적음 |
스택 크기 | 독립적 | 독립적 | 공유 |
성능 특성 비교
성능 특성 | Process | Thread | Coroutine |
---|---|---|---|
생성 시간 | 느림 | 중간 | 빠름 |
컨텍스트 스위치 시간 | 느림 | 중간 | 빠름 |
메모리 접근 | 독립적 (느림) | 공유 (빠름) | 공유 (매우 빠름) |
확장성 한계 | CPU 코어 수 | 시스템 리소스 | 이벤트 루프 성능 |
사용 사례별 비교
사용 사례 | 적합한 모델 | 이유 |
---|---|---|
대규모 데이터 처리 | Process | 메모리 격리와 CPU 활용 |
웹 서버 | Thread/Coroutine | I/O 작업 처리에 효율적 |
실시간 게임 | Thread | 낮은 지연시간 필요 |
GUI 애플리케이션 | Thread | 사용자 인터페이스 반응성 |
네트워크 서비스 | Coroutine | 많은 동시 연결 처리 |
이미지/비디오 처리 | Process | CPU 집약적 작업 |