프로세스와 스레드

기술노트

프로세스와 스레드 (Process and Thread)

'프로세스(Process)'는 '실행 중인 프로그램의 인스턴스'를 의미하며, 운영체제로부터 자원을 할당받는 단위입니다. 각 프로세스는 고유의 상태 정보를 담고 있는 '프로세스 제어 블록(PCB, Process Control Block)'을 가집니다. 반면, '스레드(Thread)'는 '프로세스 내에서 실행되는 흐름의 단위'이자 CPU 이용의 기본 단위입니다.


💻 프로세스와 스레드의 기술적 차이

  • 메모리 영역 : 프로세스는 완전히 독립된 메모리 영역(Code, Data, Heap, Stack)을 할당받습니다. 반면 스레드는 프로세스의 Code, Data, Heap 영역을 공유하고, 각 스레드는 별도의 '스택(Stack)'과 '프로그램 카운터(PC)' 레지스터 값만 독립적으로 가집니다.
  • 컨텍스트 스위칭 (Context Switching) : 프로세스 전환 시에는 CPU 캐시 메모리 리셋, 메모리 맵핑(TLB) 초기화 등 무거운 작업이 동반되어 오버헤드가 큽니다. 하지만 스레드 전환은 공유 메모리 영역은 그대로 둔 채, 스택 포인터와 PC 레지스터 등 일부 상태만 변경하므로 훨씬 빠릅니다.
  • 통신 (Communication) : 독립적인 프로세스 간 통신(IPC)을 위해서는 파이프, 소켓, 공유 메모리 등 복잡한 메커니즘이 필요합니다. 반면 스레드는 메모리를 공유하므로, 공유 변수 등을 통해 간단하게 통신할 수 있지만 '동기화' 문제에 유의해야 합니다.
  • 안정성 : 하나의 프로세스 오류는 다른 프로세스에 영향을 주지 않아 안정적입니다. 하지만 하나의 스레드에서 발생한 처리되지 않은 예외(Unhandled Exception)는 전체 프로세스의 종료로 이어질 수 있습니다.

🤔 멀티 프로세싱 vs 멀티 스레딩

  • 멀티 프로세싱 (Multi-processing)

> * '장점': 각 프로세스가 독립적인 주소 공간을 가져 안정성이 높고, 메모리 침범 문제에서 자유롭습니다. > * '단점': 높은 자원 소모와 복잡한 IPC 메커니즘이 요구됩니다. > * '예시': Chrome 브라우저 (각 탭이 독립 프로세스로 동작하여 하나의 탭 오류가 전체 브라우저를 중단시키지 않음).

  • 멀티 스레딩 (Multi-threading)

> * '장점': 자원 소모가 적고 컨텍스트 스위칭이 빨라 응답성이 높으며, 메모리 공유를 통해 통신이 간단합니다. > * '단점': 동기화 문제(경쟁 상태, 교착 상태) 발생 가능성이 높아 설계가 복잡하며, 하나의 스레드 오류가 전체 프로세스에 영향을 줍니다. > * '예시': 다수의 클라이언트 요청을 동시에 처리하는 웹 서버, 실시간 렌더링이 필요한 게임 엔진.


💡 개발자 핵심 Point

  • 멀티 스레딩 환경에서 공유 자원 접근을 제어하기 위해 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor)와 같은 동기화 기법의 이해는 필수적입니다.
  • Python의 CPython 인터프리터는 '전역 인터프리터 잠금(GIL, Global Interpreter Lock)' 때문에 한 번에 하나의 스레드만 Python 바이트코드를 실행할 수 있습니다. 이로 인해 CPU-bound 작업에서는 멀티 스레딩의 성능 향상이 제한적이며, 주로 I/O-bound 작업에서 비동기 처리를 위해 활용됩니다.
  • 작업의 성격(CPU-bound vs I/O-bound), 안정성 요구사항, 자원 제약 등을 종합적으로 고려하여 아키텍처에 멀티 프로세싱과 멀티 스레딩 중 어느 것을 적용할지 선택해야 합니다.