프로세스는 별도의 메모리 공간에서 실행되기 때문에 서로의 메모리에 직접 접근할 수 없어 Inter-Process Communication (IPC) 메커니즘을 사용하여 통신합니다. 일반적인 IPC 메커니즘에는 파이프, 메시지 큐, 공유 메모리, 소켓 등이 있습니다. 반면 스레드는 동일한 프로세스 내에서 실행되며 전역 변수 및 힙 메모리를 포함한 동일한 메모리 공간을 공유합니다. 스레드는 공유 변수나 데이터 구조에 접근하여 직접 통신할 수 있습니다. 하지만 이로 인해 동기화 문제가 발생할 수 있으며, 뮤텍스, 세마포어 또는 조건 변수와 같은 동기화 기본 요소를 사용해야 합니다.
프로세스는 코드, 데이터 및 시스템 리소스(예: 파일 디스크립터)를 포함한 고유한 메모리 공간을 가진 독립적인 실행 단위입니다. 각 프로세스는 격리되어 실행되어 더 나은 내결함성 및 보안을 제공합니다. 스레드는 프로세스 내에 존재하는 가벼운 실행 단위로, 프로세스의 메모리 공간(전역 변수 및 힙 메모리 포함)을 공유하지만 고유한 스택과 레지스터 값을 갖습니다. 이 공유 메모리 공간은 프로세스와 비교하여 빠른 통신 및 낮은 컨텍스트 교환 오버헤드를 가능하게 하지만, 경쟁 상태와 같은 문제를 피하기 위해 신중한 동기화가 필요합니다.
멀티 프로세스 사용 시기:
실행 단위 간 강력한 격리가 필요한 경우(보안 또는 내결함성과 관련)
광범위한 통신이나 공유 상태가 필요하지 않은 별도의 독립적인 단위로 쉽게 나눌 수 있는 작업이 있는 경우
다중 프로세서 코어를 활용하고 Python과 같은 일부 프로그래밍 언어의 전역 인터프리터 락(GIL)과 관련된 잠재적 문제를 피하려는 경우
멀티 스레드 사용 시기:
빈번한 통신이나 공유 데이터 구조에 접근이 필요한 작업이 있는 경우
여러 스레드가 사용자 입력, 백그라운드 작업 및 UI 업데이트를 동시에 처리하여 프로그램의 반응성을 향상시키는 경우, 예를 들어 GUI 애플리케이션에서
프로세스를 생성하고 관리하는 오버헤드를 최소화하려는 경우, 스레드는 컨텍스트 교환 오버헤드와 메모리 사용량이 더 낮습니다.
스레드 동기화란 여러 스레드의 실행을 조정하여 올바른 작업 순서를 보장하고 공유 리소스에 접근할 때 경쟁 조건을 방지하는 과정입니다. 뮤텍스, 세마포어 또는 조건 변수와 같은 동기화 기법은 여러 스레드가 공유 리소스에 적절한 조정 없이 동시에 접근할 때 발생할 수 있는 데이터 손상, 교착 상태 또는 예기치 않은 동작과 같은 문제를 방지하는 데 도움이 됩니다.
뮤텍스(상호 배제를 의미)는 동기화 기본 요소로, 한 번에 하나의 스레드만 공유 리소스에 접근할 수 있도록 합니다. 뮤텍스는 잠금과 같이 작동하여 스레드가 임계 영역에 들어가기 전에 잠금을 획득하고, 임계 영역을 떠난 후 잠금을 해제해야 합니다. 반면 세마포어는 지정된 한도 내에서 여러 스레드에 의한 공유 리소스 접근을 제어할 수 있는 보다 일반적인 동기화 기본 요소입니다. 세마포어는 카운터를 유지하며, 스레드가 세마포어를 획득할 때 카운터가 감소하고 세마포어를 해제할 때 카운터가 증가합니다. 카운터가 0에 도달하면 다른 스레드는 다시 사용 가능할 때까지 기다려야 합니다.