컴퓨터 성능의 극대화를 위해 병렬처리는 필수적인 요소이다. 병렬 처리를 구현하는 주요 방법으로 멀티 프로세스와 멀티 스레드가 있다. 이 두 가지 방법은 각기 다른 장단점을 가지고 있으며, 상황에 따라 적합한 방법을 선택하는 것이 중요하다. 이번 글에서는 멀티 프로세스와 멀티 스레드의 차이점을 비교하고, 각 방법의 장단점을 살펴본 후 상황에 맞는 적합한 방법을 제안하고자 한다.
멀티 프로세스 (Multi Process)
멀티 프로세스는 여러 개의 프로세스를 생성하여 병렬로 작업을 수행하는 방식으로 각 프로세스는 독립적인 메모리 공간을 가지 별도의 자원을 사용한다.
장점
- 안전성: 각 프로세스는 독립적인 메모리 공간을 가지므로 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스에 영향을 미치지 않는다.
- 병렬성: 여러 프로세스가 각기 다른 CPU 코어에서 실행될 수 있어 진정한 병렬 처리가 가능하다.
- 글로벌 인터프리터 락(GIL) 회피: Python과 같은 언어에서 GIL로 인해 멀티 스레드의 성능이 제한되는 문제를 회피할 수 있다.
단점
- 오버헤드: 프로세스 간의 컨텍스트 스위칭 비용이 높고, 독립적인 메모리 공간을 사용하므로 메모리 사용량이 증가한다.
- 복잡성: 프로세스 간의 데이터 공유와 통신이 어려워 소켓, 파이프, 큐 등의 별도 통신 방법을 사용해야한다.
- 생성 비용: 프로세스를 생성하는 비용이 스레드에 비해 높다.
멀티 스레드(Multi Thread)
멀티 스레드는 하나의 프로세스 내에서 여러 스레드를 생성하여 병렬로 수행하는 방식으로 모든 스레드는 동일한 메모리 공간을 공유한다.
장점
- 경량성: 스레드는 프로세스보다 생성 비용이 낮고, 메모리 공유로 인해 자원 소모가 적다.
- 데이터 공유 용이성: 동일한 메모리 공간을 공유하므로, 데이터 공유와 통신이 비교적 쉽다.
- 응답성: 스레드를 사용하면 응답성이 높은 애플리케이션을 구현할 수 있다.
단점
- 안전성: 한 스레드의 비정상 종료가 전체 프로세스에 영향을 미칠 수 있다.
- 병렬성 제한: Python의 경우 GIL로 인해 CPU 바운드 작업에서 멀티 스레드의 병렬성에 제한이 있다.
- 복잡성: 스레드 간의 동기화 문제로 인해 데드락, 레이스 컨디션 등의 문제가 발생할 수 있다.
그래서 어떤거 써야될까??
멀티 프로세스가 적합한 경우
- CPU 바운드 작업: CPU 자원을 많이 사용하는 작업에서는 멀티 프로세스가 GIL 문제를 회피하여 더 나은 성능을 제공한다. (ex 데이터 분석)
- 안전성이 중요한 경우: 하나의 작업 실패가 다른 작업에 영향을 주지 않아야 하는 경우 멀티 프로세스가 적합하다.(ex 웹서버)
- 독립적인 작업: 작업 간의 데이터 공유가 거의 없고 독립적으로 수행되는 경우 (ex 분산 컴퓨팅)
멀티 스레드가 적합한 경우
- I/O 바운드 작업: 파일 입출력, 네트워크 통신 등 I/O 작업이 많은 경우 (ex Python의 스크래핑)
- 메모리 절약: 동일한 메모리 공간을 공유하므로 메모리 사용량을 최소화해야 하는 경우 (ex GUI 애플리케이션 )
- 빠른 응답성: 사용자 인터페이스와 같이 빠른 응답이 필요한 경우 (ex java-spring)