Multi Process (멀티 프로세스)
프로그램 / 프로세스
- 프로그램 : 컴퓨터에서 실행할 수 있는 파일. 실행하기 전엔, 정적인 코드 덩어리.
- 프로세서 : 프로그램을 실행하는 하드웨어 유닛. CPU 혹은 Microprocessor를 일컫는다.
- 프로세스 : 프로그램이 메모리에 적재된 후, 프로그램이 실행 중이거나 실행 대기 중에 있는 상태. 동적인 작업의 단위. 즉, 메모리에 적재되어 프로세서에 의해 실행중인 프로그램.
멀티 프로세싱
- 하나의 컴퓨터에서 2개 이상의 CPU(프로세서) 를 사용하여 프로그램을 병렬적으로 처리하는 방식.
동작 방식
- 각 CPU는 주 메모리에 연결되어있다.
- 수행해야 할 작업은 모든 프로세서에 분배.
- 각 프로세서의 모든 작업이 완료되면 이를 함께 컴파일하여 단일 출력을 생성.
장/단점
- 여러 작업을 병렬적으로 처리하기 때문에, 더 빠른 속도로 작업을 처리할 수 있다.
- 하지만, 여러 작업을 병렬적으로 처리하기 때문에, 동시성 문제를 해결해야할 필요가 있다.
멀티 프로세스
- 하나의 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술.
멀티 프로세스 / 멀티 프로세싱?
- 프로세서는 프로그램이 실행할 수 있게하는 하드웨어이다. 따라서 멀티 프로세스와 멀티 프로세서는 같은 의미가 아닐까 생각할 수 있지만 엄밀히 따지자면 별개의 개념이다.
- 멀티 프로세싱은 다중의 CPU 로 작업을 병렬적으로 처리하는 방식, 멀티 프로세스는 하나의 프로그램에 대해 다중의 프로세스가 생성된 상태를 뜻한다.
- 멀티 프로세싱은 여러 작업을 더 빠르게 처리하기 위한 것에 초점을, 멀티 프로세스는 프로세스를 세분화 하여 더욱 안정성있고, 각 프로세스간의 유연한 소통이 가능한 것에 초점을 맞춘 것이라고 생각하면 될 듯 하다.
많은 블로그 및 자료에서 멀티 프로세스와 멀티 프로세싱 용어를 혼용하여 사용하는 듯합니다. 그래서 멀티 프로세스 와 멀티 프로세싱의 연관성과 면확한 차이점에 대해 찾아보려했지만 마땅한 자료가 없었습니다. 추후 자료를 찾으면 보충해보도록 하겠습니다.
구조
- 멀티 프로세스는 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성하는 방식으로 구성된다.
- 부모 프로세스와 자식 프로세스는 기본적으로 서로 독립적이다.
자식 프로세스 생성 방식
-
부모 프로세스는 실행되는 도중, 프로세스 생성 시스템 콜 중 하나인 fork() 메서드를 통해 자식 프로세스들을 생성한다. 즉, 부모 프로세스는 fork() 시스템 콜을 통해 자식 프로세스를 생성하는 프로세스이다.
시스템 콜은 프로그램과 운영 체제 사이에서 상호작용하는 인터페이스를 의미한다. 프로그램이 운영 체제 커널에 서비스를 요청하는 프로그래밍 방식을 의미한다.
- fork() : 새로운 프로세스 공간을 별도로 만들고, fork() 시스템 콜을 호출한 부모 프로세스 공간의 데이터을 모두 복사한다.
프로세스 간 통신 (IPC)
- 멀티 프로세스 에서는 서로 다른 프로세스간의 데이터 공유 및 상호작용을 할 수있다. 이는 프로세스 간 통신(Inter-Process Communication, IPC) 를 통해 가능하다.
독자 / 협력 적인 프로세스
- 기본적으로 프로세스는 독자적이며, 다른 프로세스의 실행으로 부터 영향을 받지 않는다. 하지만 다른 프로세스와 상호작용을 할 경우(IPC 를 통해), 다른 프로세스의 실행에 영향을 받을 수 있는 협력 프로세스가 된다.
동기화
- 프로세스간 데이터를 공유하기 때문에, 공유 자원에 동시에 접근하는 문제가 발생할 수 있으므로 동기화에 유의해야한다.
- IPC 의 방식중 공유 메모리 방식은 동기화를 직접 구현해야하지만, 메세지 전달 방식은 동기적인 통신을 지원한다.
장/단점
- 시스템 복잡도가 증가하고, 동기화에 유의하지 않으면 데이터 일관성이 해쳐질 수 있다는 단점도 존재하지만,
- 프로세스간의 유연하고 효율적인 통신을 지원하고, 분산 시스템을 개발 가능하게 해준다는 점에서 현대 운영체제에서는 필수적인 요소이다.
공유 메모리 방식 (Sharing Memory)
- 프로세스가 공통 메모리 공간을 사용하여 데이터를 교환한다.
-
생성자가 데이터를 생성하고, 소비자가 소비한다. 이 둘은 buffer 라는 공유 메모리를 사용한다.
- 생산자가 데이터를 생성해 buffer 에 추가하고, buffer 가 꽉 차면 대기한다.
- 소비자는 buffer 에서 데이터를 가져와 소비하고, buffer 가 비어있으면 대기한다.
- 효율적인 방법이지만, 동기화를 신경써야한다.
메시지 전달 방식 (Message Passing)
-
메시지 교환만을 통해 통신하며, 동기적인 통신이 가능하다.
-
직/간접
- 직접 통신 : 프로세스가 수신자나 발신자를 명시적으로 지정한다.
- 간접 통신 : 메일박스(mailbox)라는 중간 매개체를 통해 메시지를 전달한다.
-
동기/비동기
- 동기 통신 : 송신자는 수신 확인 전까지 대기한다.
- 비동기 통신 : 송신자는 확인 없이 다른 작업을 계속 진행한다.
장/단점
- 하나의 프로그램을 독립적인 메모리 공간을 가지는 프로세스로 나누어 처리하는 부분에서 이점이 발생한다.
안정성
- 각 프로세스가 독립적인 메모리 공간을 가지므로, 한 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향을 주지않는다. 따라서 프로그램 전체의 안정성을 확보할 수 있다.
확장성
- 각 프로세스가 독립적이므로, 새로운 기능이나 모듈을 추가하거나 수정할때 다른 프로세스에 영향을 주지 않는다. 그래서 시스템의 규모를 쉽게 확장할 수 있다.
- 이를 네트워크 서버에 적용하면, 로드 밸런서를 얘기할 수 있다. 로드밸런서는 요청을 여러 서버에 분산시키는 기능을 한다. 이때 여러 서버는 여러 컴퓨터가 될수도 있지만, 멀티 프로세스를 적용하면 하나의 성능 좋은 컴퓨터에 여러개의 서버 프로세스를 두는 것이 될 수도 있다.
- 서버 클러스터도 하나의 컴퓨터에 여러개의 서버 프로세스를 띄움으로써 요청을 분산시키는 방법으로 이에 해당된다고 할 수 있다. Node.js 진영에선 대표적으로 PM2 가 있다.
단점
Context Switching Overhead
컨텍스트 스위칭(Context Switching) 은 기존 프로세스가 실행되고 있는 상태에서 interrupt 가 발생하여 다른 프로세스가 실행되어야 할 때, 프로세스의 컨텍스트를 교체하는 과정을 뜻한다. 이 과정에는 기존 프로세스의 컨텍스트(상태) 를 나중에 복원할 수 있도록 저장하고, 다른 프로세스의 컨텍스트 를 실행하기 위해 로드하는 작업을 포함한다. interrupt 가 발생하는 상황에는 입출력 요청이 발생했을 때, CPU 사용시간 만료되었을 때, 자식 프로세스를 생성했을 때 등이 있다.
- 멀티 프로세스 환경에서는 자식 프로세스를 생성하기에, interrupt 가 발생하여 컨텍스트 스위칭도 불가피하게 된다. 컨텍스트 스위칭이 발생할때마다, CPU 는 다음 프로세스의 정보를 로드하고, 기존 프로세스의 컨텍스트를 저장해야하기 때문에, 빈번하게 컨텍스트 스위칭이 일어난다면 비용 오버헤드가 발생할 수 있게 된다.
출처
👩💻 멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리
프로세스 생성 시스템 콜 - fork(), exec() - 1
OS - Context Switch(컨텍스트 스위치)가 무엇인가?
[CS] 멀티 프로세스/스레드와 context switching