프로그램
프로세스
프로세스로만 작업 처리 시 문제점:
- 프로세스 생성 시 오버헤드 발생
- 문맥 교환 시 오버헤드가 큼
- 프로세스 간 통신이 어려움
스레드
프로세스의 스택을 제외한 힙, 코드, 데이터 영역은 스레드끼리 공유함.
스택 영역은 각 스레드가 독립적으로 할당받음.
스레드가 실행되는 데 필요한 정보는 스택에 독립적으로 저장을 하지만, 동적 정보는 힙에 저장되고 모든 스레드가 이를 공유한다.
스레드로 작업 처리 시 장점:
- 프로세스보다 작은 실행 단위 구현 가능
- 프로세스 생성 시 오버헤드 감소
- 자원을 공유하기 때문에 빠른 문맥교환
- 프로세스 간 통신
멀티 프로세스
컴퓨터에서 동시에 여러 개의 프로세스가 실행되는 방식.
장점
- 각각의 프로세스가 독립적으로 실행되기 때문에 서로 영향을 주지 않음 (한 프로세스에 문제가 생겨도 다른 프로세스에는 영향 x)
단점
- 프로세스 간 문맥교환이 자주 발생하므로 성능에 영향을 줌.
- 프로세스마다 독립적인 메모리 공간이 있어야 하므로 프로세스가 많아질 수록 차지하는 메모리가 많아짐.
멀티 스레드
- 컴퓨터에서 단일 프로세스 내에서 동시에 여러 개의 스레드가 실행되는 방식.
장점
- 스레드 간 데이터를 공유하며 통신이 원활함. -> 작업의 효율성 up
- 문맥교환의 비용이 멀티 프로세스의 문맥교환보다 적음
주의할 점
- 교착상태: 한 스레드가 점유한 자원을 다른 스레드가 무한으로 기다리고, 반대로도 마찬가지인 상태.
식사하는 철학자 문제
스레드 풀
일정한 개수의 스레드들을 미리 생성하고 작업이 들어왔을 때 스레드 중 하나에 작업을 할당하여 처리하는 기법.
사용하는 이유
스레드 생성 및 제거에 대한 오버헤드를 줄이고 스레드를 재사용하여 처리 속도와 성능을 향상시키기 위해
구성 요소
- 작업 큐
- 스레드 풀이 작업을 저장하는 공간. 작업이 도착했을 때 여기에 추가되고 스레드가 작업을 수행할 때 여기에서 가져감.
- 스레드 생성 및 제거 매커니즘
- 스레드 관리자
- 스레드의 생성, 할당, 반환, 우선순위 관리 등을 수행
동작
- 초기화: 미리 정해진 개수의 스레드를 생성. 이 때 스레드들은 작업이 들어오기를 기다리는 상태.
- 작업 요청: 외부에서 작업이 도착하면 작업 큐에 추가되고 해당 작업은 스레드 풀에게 요청됨.
- 작업 할당: 작업 큐에서 작업을 꺼내어 실행 가능한 스레드에게 할당함.
- 작업 실행: 할당된 스레드는 작업을 실행하고, 완료되었을 때 다음 작업을 위해 작업 큐에서 다시 작업을 가져옴.
- 스레드 재사용: 작업이 완료된 스레드는 작업 큐로 돌아가 새로운 작업을 할당받은 준비를 함.
- 작업 완료: 모든 작업이 완료되면 스레드 풀은 종료될 수 있음. 하지만 작업 큐가 비워질 때까지 모든 스레드는 대기 상태 유지.
단점
- 정의된 스레드보다 더 많은 양의 작업이 들어오면 다 작업 큐에 추가됨. 메모리 사용량 up
- 작업이 처리되기 위해 스레드를 기다려야하기 때문에 이에 따른 지연이 발생할 수 있음.
- 작업의 우선순위 관리 어려움
- 교착상태 발생 가능
동시성(Concurrency) vs. 병렬성(Parallelism)
동시성
여러 작업이 동시에 실행되는 것처럼 '보이는' 개념.
실제로는 각 작업이 작은 시간 단위로 번갈아가며 실행됨.
병렬성
여러 작업이 실제로 동시에 실행됨.
여러 프로세서 또는 코어가 동시에 작업을 처리함.