
"PHP는 멀티프로세스일까요? 멀티스레드일까요?"
약 1년간 Vue.js를 사용한 프론트엔드 개발 경력을 쌓은 나에게, 풀스택 개발자로 성장할 기회가 찾아왔다.
Vue와 Laravel을 기반으로 한 기술 스택으로 이제 막 프로덕트를 개발하고 있는 회사로 이직하게 되었다.
PHP와 Laravel에 적응해 나가던 중, 팀장님께서 한 가지 질문을 던지셨다.
"PHP는 멀티프로세스 언어일까요? 아니면 멀티스레드 언어일까요?"
이 질문은 내가 스레드와 프로세스의 차이점을 제대로 이해할 필요가 있음을 깨닫게 해주었다.
프로세스(Process), 스레드(Thread)란?
스레드란?
- 스레드는 프로세스 내에서 실행되는 하나의 작업 단위.
- 동일한 프로세스의 스레드는 코드, 데이터, 파일과 같은 메모리 공간을 공유.
- 하나의 프로세스는 여러 스레드를 포함할 수 있으며, 이를 멀티스레딩이라고 함.
프로세스란?
- 프로세스는 운영체제에서 실행 중인 하나의 독립적인 프로그램.
- 프로세스는 운영체제로부터 별도의 메모리 공간과 리소스를 할당받음.
- 하나의 프로세스는 다른 프로세스와 메모리를 공유하지 않으며, 완전히 독립적인 실행 단위.
각각의 장점
스레드의 장점
- 메모리 효율성
- 같은 프로세스 내의 스레드는 메모리를 공유하므로 추가 메모리 사용량이 적음.
- 빠른 통신
- 스레드 간 데이터 교환이 프로세스 간 통신(IPC)보다 빠름.
- 병렬 처리
- 멀티코어 CPU에서 여러 스레드가 병렬로 작업을 수행하여 성능을 향상시킬 수 있음.
프로세스의 장점
- 독립성
- 하나의 프로세스가 문제가 발생해도 다른 프로세스에는 영향을 주지 않음.
- 안정성
- 메모리를 공유하지 않기 때문에 데이터의 무결성이 보장됨.
(데이터가 Private하게 관리됨, 외부에서의 접근은 불가능하나 통신을 통한 접근은 가능)
- 운영체제 지원
- 운영체제가 프로세스를 독립적으로 관리하므로 간단한 구조로 실행할 수 있음.
각각의 단점
스레드의 단점
- 안정성 문제
- 메모리를 공유하므로 하나의 스레드 오류가 전체 프로세스에 영향을 줄 수 있음.
- 동기화 문제
- 스레드 간 자원을 동시에 사용하려면 동기화(locking)를 관리해야 하며, 이로 인해 성능 저하가 발생할 수 있음.
프로세스의 단점
- 높은 메모리 사용량
- 각 프로세스는 독립적인 메모리 공간을 사용하므로 메모리 사용량이 많음.
- 비용이 높은 통신
- 프로세스 간 통신(IPC)은 느리고 구현이 복잡함.
- 스위칭 오버헤드
- 프로세스 간 컨텍스트 스위칭은 스레드보다 시간이 더 걸림.
PHP의 동작 방식
서두에 있었던 질문에 대답을 해보자
"PHP는 멀티프로세스 언어일까요? 아니면 멀티스레드 언어일까요?"
답은 둘다 아니다.
PHP 자체는 멀티프로세스, 멀티스레드 개념이 없음
- 싱글 프로세스 : PHP 스크립트는 한 번 실행될 때 하나의 독립적인 프로세스에서 실행
- 싱글 스레드 : PHP 프로세스 내에서 스레드를 새로 생성하거나 병렬로 처리하지 않음. 기본적으로 직선적 실행
멀티프로세스, 멀티스레드가 되는 이유는?
다중 요청 처리, 병렬 실행은 PHP가 아니라 웹 서버(Apache, Nginx + PHP-FPM)가 담당
Apache + mod_php
Apache는 Prefork MPM이나 Worker MPM 방식을 사용
mod_php란?
mod_php는 Apache 웹 서버의 모듈 중 하나
👉 한 마디로:
Apache가 PHP 해석기를 직접 내장
[Client] → [Apache] → [mod_php (PHP 처리)] → [Apache] → [Client]
- Prefork MPM: 멀티 프로세스 기반 → 요청 1개당 프로세스 1개
- Worker MPM: 멀티 스레드 기반 → 요청당 스레드 사용
Nginx + PHP-FPM
PHP-FPM은 미리 여러 개의 워커 프로세스를 띄워놓고 요청을 처리
즉, API 요청 1개가 이미 떠 있는 워커 프로세스 하나에 전달되어 처리.
- 요청 1개 = 워커 프로세스 1개 사용 (재사용됨)
- 요청이 끝난다고 해서 프로세스가 죽지는 않음, 계속 유지되며 다음 요청 대기.
요청할 때마다 새로운 프로세스가 생성되는 건 아님.
PHP-FPM은 초기 실행 시 여러 프로세스를 띄워놓고, 요청당 하나의 프로세스가 할당되어 처리 후 재사용.
apache2ctl -V
서버 설정을 확인해보니
Server MPM: prefork
이렇게나오는데
결론:
현재 Apache는 Prefork MPM을 사용 중
멀티 스레드, 멀티 프로세스 어느 것을 선택?
멀티 스레드를 선택해야 하는 경우
- 병렬 처리 성능이 중요할 때
멀티코어 CPU의 성능을 최대한 활용해야 하는 경우 (예: 게임, 실시간 데이터 처리).
- 메모리 효율이 중요할 때
동일한 리소스에 접근하는 작업이 많고 메모리 사용량을 최소화해야 할 때 (예: 웹 서버).
멀티 프로세스를 선택해야 하는 경우
- 안정성이 중요할 때
오류가 한 작업에만 제한되어야 하고 다른 작업에 영향을 주지 않도록 해야 하는 경우 (예: 크롬 브라우저의 탭 분리).
- 독립적인 작업 수행이 필요할 때
서로 다른 작업 간의 메모리와 데이터를 철저히 격리해야 할 때 (예: 운영체제의 시스템 프로세스).
결론
- 멀티스레드는 메모리 공유를 통한 빠른 처리와 병렬 작업에 적합하지만, 동기화와 안정성 문제에 주의해야 함.
- 멀티프로세스는 안정성과 독립성이 중요한 경우에 적합하지만, 높은 리소스 소비와 통신 비용을 고려해야 함.