멀티 프로세스 vs 멀티 쓰레드 는 개발자 면접에서 자주 나오는 질문 중의 하나!
멀티 프로세스는 '한 어플리케이션에 대한 처리방식' 이라고 보면 된다.
단순히 프로그램을 여러개 띄워놓는 것이 아니라, 언제 어느때에 어떤 방식으로 처리하느냐에 따라 다른 것으로 이해해야 한다.
하나의 부모 Process가 여러 개의 자식 Process를 생성함으로써, 다중 Process를 구성하는 구조
한 Process는 실행되는 도중 Process 생성 시스템 콜을 통해 새로운 Process들을 생성할 수 있는데,
부모 프로세스(Parent Process)
자식 프로세스(Child Process)
PID (Process ID)
부모 프로세스와 자식 프로세스는 각각 고유한 PID(Process ID)를 가지고 있다.
단, 통신이 가능할 뿐, 부모 프로세스와 자식 프로세스는 엄연히 서로 다른 프로세스이므로
독립적으로 실행되고 독립적인 메모리 공간을 가지고 있기 때문에, 서로 다른 작업을 수행한다.
예시로 웹 브라우저의 상단 탭(Tab) 이나 새 창을 들 수 있다.
각 브라우저 탭은 같은 브라우저 프로그램 실행이지만, 각기 다른 사이트를 실행한다.
멀티 Process는 각 Process가 독립적인 메모리 공간을 가지므로, 한 Process가 비정상적으로 종료되어도 다른 Process에 영향을 주지 않는다.
따라서, 프로그램 전체의 안전성을 확보할 수 있다는 장점이 있다.
예시
멀티 Process와 여러 개의 CPU 코어를 활용하여, 다중 CPU 시스템에서 각 Process를 병렬적으로 실행하여 성능을 향상시킬 수 있다.
예시
단, 멀티 Thread로 구성하는 것이 멀티 Process로 구성하는 것보다 훨씬 효율적이고 빠르기 때문에,
멀티 Process로 성능을 올리는 일은 거의 없다고 보면 된다.
멀티 Process는 각 Process가 독립적이므로, 새로운 기능이나 모듈을 추가/수정할 때 다른 Process에 영향을 주지 않는다.
따라서, 시스템의 규모를 쉽게 확장할 수 있다.
예시
Context Switching 과정에서 성능 저하가 올 수 있다.
Process ontext Switching 의 경우, 빈번한 Context Switching 작업으로 인해 비용 오버헤드가 발생할 수 있게 된다.
(CPU는 다음 프로세스의 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비)
Thread ontext Switching 의 경우, 프로세스 스위칭 보다 가벼워 훨씬 빠르고 좋다.
따라서, 멀티 Process 환경에서는 Context Switching Overhead를 최소화하는 방법이 중요하다.
(프로세스 수를 적정하게 유지, I/O 바운드 작업이 많은 프로세스와 CPU 바운드 작업이 많은 프로세스를 분리하여 관리, CPU 캐시를 효율적으로 활용 등...)
멀티 Process는 각 Process가 독립적인 메모리 공간을 가지므로, 결과적으로 메모리 사용량이 증가하게 된다.
이때, 각 Process간에 자원 공유가 필요할 경우 Process 사이의 IPC(Inter-Process Commnuication)을 사용하여야 한다.
(IPC 는 운영체제 상에서 실행 중인 프로세스 간에 정보를 주고받는 메커니즘(사용하기에 어렵고 복잡한 통신 기법이다). IPC 자체로도 Overhead가 발생해버린다.)