프로세스(Process), 스레드(Thread)란? (feat. PHP)

Zain·2024년 7월 12일

"PHP는 멀티프로세스일까요? 멀티스레드일까요?"

약 1년간 Vue.js를 사용한 프론트엔드 개발 경력을 쌓은 나에게, 풀스택 개발자로 성장할 기회가 찾아왔다.
Vue와 Laravel을 기반으로 한 기술 스택으로 이제 막 프로덕트를 개발하고 있는 회사로 이직하게 되었다.

PHP와 Laravel에 적응해 나가던 중, 팀장님께서 한 가지 질문을 던지셨다.
"PHP는 멀티프로세스 언어일까요? 아니면 멀티스레드 언어일까요?"

이 질문은 내가 스레드와 프로세스의 차이점을 제대로 이해할 필요가 있음을 깨닫게 해주었다.


프로세스(Process), 스레드(Thread)란?

스레드란?

  • 스레드는 프로세스 내에서 실행되는 하나의 작업 단위.
  • 동일한 프로세스의 스레드는 코드, 데이터, 파일과 같은 메모리 공간을 공유.
  • 하나의 프로세스는 여러 스레드를 포함할 수 있으며, 이를 멀티스레딩이라고 함.

프로세스란?

  • 프로세스는 운영체제에서 실행 중인 하나의 독립적인 프로그램.
  • 프로세스는 운영체제로부터 별도의 메모리 공간과 리소스를 할당받음.
  • 하나의 프로세스는 다른 프로세스와 메모리를 공유하지 않으며, 완전히 독립적인 실행 단위.

각각의 장점

스레드의 장점

  1. 메모리 효율성
    • 같은 프로세스 내의 스레드는 메모리를 공유하므로 추가 메모리 사용량이 적음.
  2. 빠른 통신
    • 스레드 간 데이터 교환이 프로세스 간 통신(IPC)보다 빠름.
  3. 병렬 처리
    • 멀티코어 CPU에서 여러 스레드가 병렬로 작업을 수행하여 성능을 향상시킬 수 있음.

프로세스의 장점

  1. 독립성
    • 하나의 프로세스가 문제가 발생해도 다른 프로세스에는 영향을 주지 않음.
  2. 안정성
    • 메모리를 공유하지 않기 때문에 데이터의 무결성이 보장됨.
      (데이터가 Private하게 관리됨, 외부에서의 접근은 불가능하나 통신을 통한 접근은 가능)
  3. 운영체제 지원
    • 운영체제가 프로세스를 독립적으로 관리하므로 간단한 구조로 실행할 수 있음.

각각의 단점

스레드의 단점

  1. 안정성 문제
    • 메모리를 공유하므로 하나의 스레드 오류가 전체 프로세스에 영향을 줄 수 있음.
  2. 동기화 문제
    • 스레드 간 자원을 동시에 사용하려면 동기화(locking)를 관리해야 하며, 이로 인해 성능 저하가 발생할 수 있음.

프로세스의 단점

  1. 높은 메모리 사용량
    • 각 프로세스는 독립적인 메모리 공간을 사용하므로 메모리 사용량이 많음.
  2. 비용이 높은 통신
    • 프로세스 간 통신(IPC)은 느리고 구현이 복잡함.
  3. 스위칭 오버헤드
    • 프로세스 간 컨텍스트 스위칭은 스레드보다 시간이 더 걸림.

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의 성능을 최대한 활용해야 하는 경우 (예: 게임, 실시간 데이터 처리).
  • 메모리 효율이 중요할 때
    동일한 리소스에 접근하는 작업이 많고 메모리 사용량을 최소화해야 할 때 (예: 웹 서버).

멀티 프로세스를 선택해야 하는 경우

  • 안정성이 중요할 때
    오류가 한 작업에만 제한되어야 하고 다른 작업에 영향을 주지 않도록 해야 하는 경우 (예: 크롬 브라우저의 탭 분리).
  • 독립적인 작업 수행이 필요할 때
    서로 다른 작업 간의 메모리와 데이터를 철저히 격리해야 할 때 (예: 운영체제의 시스템 프로세스).

결론

  • 멀티스레드는 메모리 공유를 통한 빠른 처리와 병렬 작업에 적합하지만, 동기화와 안정성 문제에 주의해야 함.
  • 멀티프로세스는 안정성과 독립성이 중요한 경우에 적합하지만, 높은 리소스 소비와 통신 비용을 고려해야 함.
profile
Vue, Laravel | TS, JS, PHP, MySQL

0개의 댓글