1장에서 말했듯 프로세스는 독립된 자원을 할당받음으로 각각 고유의 공간을 가지게 된다.
이 때문에, 다른 프로세스와 자원을 공유하기 위해서는 IPC(Inter-process communication)가 필요하다.
운영체제의 프로세스는 Independent Process이거나 Cooperating Process이다.
Independent Process
Cooperating Process
서로 다른 프로세스 간에 일부 주소 공간을 공유하게 하는 방식
Shared Memory의 위치
프로세스 주소 공간 내부에 위치한다. 다른 프로세스와 Shared Memory를 통해 통신하고자 하는 프로세스는 다른 프로세스의 주소 공간을 자신의 주소 공간에 붙여야 한다.
일반적으로 운영체제는 한 프로세스가 다른 프로세스의 주소 공간에 접근하는 것을 막고 있지만 Shared Memory를 이용한다는 것은 그러한 제한을 잠시 거두는 것이다.
메시지 패싱은 동일한 주소 공간을 공유하지 않고 커널을 통해 메시지를 주고 받는 방식
메시지 패싱에서 메시지를 교환하는 방식은 Direct, Indirect 두 방식으로 나뉜다.
1. Direct(링크)
💡 모듈성
모듈성이란 구성요소 일부를 변경할 때 전체에 영향을 미치지 않도록 일부만 바꿀 수 있도록 설계되어 있는 것을 의미하는데 Direct 방식은 어떤 프로세스의 이름을 변경한다면 연결되어 있는 모든 Sender와 Recieve 프로세스를 변경해야한다.
- 이러한 링크는 두 개의 프로세스만 연결하며 하나의 링크만이 두 프로세스 간에 존재한다.
- 링크는 주로 양방향이지만 단방향일 수도 있다.
2.Indirect(메일박스)
메시지는 mailbox(port)를 통해 전송하고 수신된다.
mailbox (a.k.a port)는 메시지를 저장, 삭제할 수 있는 객체라 할 수 있다.
각각의 mailbox는 unique한 ID를 가지고 있다. 프로세스들은 서로 mailbox를 공유하고 있는 경우 링크가 생성되어 통신할 수 있다.
동기화 문제란 다른 프로세스가 동시에 어떤 자원에 접근했을 때 예측과 다른 결과를 가지게 되는 문제이다.
메시지 패싱은 이런 동기화 문제를 해결하기 위해 Blocking 방식과 Non-Blocking 방식이 사용된다.
프로세스 사이에서 교환되는 메세지는 Temporary Queue에 거주한다. 이런 임시 큐는 세 방법 중 하나로 구현된다.
프로세스와 프로세스를 연결하는 바이트 스트림
1. 익명 PIPE(Anonymous PIPE)
파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다.
따라서 파이프는 단방향 통신만 가능하기 때문에 양방향으로 정보를 주고받으려면 두 개의 파이프가 필요하다.
익명 파이프(Pipe)는 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용
2. Named PIPE(FIFO)
호스트 영역의 서버 클라이언트 간에 전이중 통신을 위해서는 결국 PIPE와 같이 두개의 FIFO파일이 필요하다.
💡 Anonymous PIPE vs Named PIPE
Named PIPE는 전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용 가능하나 익명 파이프(PIPE)는 같은 PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능하다.
💡 메세지 패싱과 차이
메시지 패싱은 양방향 통신이 가능하며 명시적인 메시지를 사용하는 범용적인 IPC 방식이고, 파이프는 단방향 통신에 주로 사용되며 한 방향으로 데이터의 흐름을 지원하는 IPC 방식
메세지 패싱은 보통은 메시지 큐, 소켓, RPC(Remote Procedure Call) 등을 사용하여 구현하며 파이프는 운영 체제에서 제공하는 파이프 또는 네트워크 상에서 사용되는 파이프라인 등을 이용한다.