본문 바로가기

공부 기록/OS

[OS/공룡책] Chapter 3. 프로세스 - 프로세스 간 통신

프로세스 간 통신

- 프로세스가 시스템에서 실행 중인 다른 프로세스들과 데이터를 공유하지 않는 프로세스는 독립적이다. 프로세스가 시스템에서 실행 중인 다른 프로세스들에 영향을 주거나 받는다면 이는 협력적인 프로세스들이다.

- 협력적 프로세스들은 데이터를 교환할 수 있는, 즉 서로 데이터를 보내거나 받을 수 있는 프로세스 간 통신(interprocess communication, IPC) 기법이 필요하다.

- 프로세스 간 통신에는 기본적으로 두 가지 모델이 있다. => 공유 메모리와 메시지 전달

   - 공유 메모리 모델 : 공유 메모리 영역을 구축할 때만 시스템 콜이 필요하며, 공유 메모리 영역이 구축되면 모든 접근은 일반적인 메모리 접근으로 취급되어 커널의 도움이 필요 없다. 메시지 전달 모델보다 더 빠르다.

   - 메시지 전달 모델 : 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하는 데 유용하다. 또한 분산 시스템에서 공유 메모리보다 구현하기 쉽다.

공유 메모리(a)와 메시지 전달(b)


공유 메모리 시스템에서의 프로세스 간 통신

- 공유 메모리를 사용하는 프로세스 간 통신에서는 통신하는 프로세스들이 공유 메모리 영역을 구축해야 한다.

- 일반적으로 운영체제는 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 금지한다. => 공유 메모리는 둘 이상의 프로세스가 이 제약 조건을 제거하는 것에 동의해야 한다. 그 후에 프로세스들은 공유 영역에 읽고 씀으로써 정보를 교환할 수 있다.

- 생산자 프로세스는 정보를 생산하고 소비자 프로세스는 정보를 소비한다.

- 싱산자-소비자 문제의 하나의 해결책은 공유 메모리를 사용하는 것이다. => 생산자와 소비자가 반드시 동기화되어야 생산되지도 않은 항목들을 소비자가 소비하려고 시도하지 않을 것이다.

- 두 가지 유형의 버퍼가 사용된다. => 무한 버퍼, 유한 버퍼


메시지 전달 시스템에서의 프로세스 간 통신

- 메시지 전달 방식은 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그들의 동작을 동기화할 수 있도록 허용하는 기법을 제공한다.

- 분산 환경에서 특히 유용하다.

- 메시지 전달 시스템은 최소한 두 가지 연산을 제공한다. => send(message), receive(message)

- 만약 프로세스 P와 Q가 통신을 원하면 반드시 서로 메시지를 보내고 받아야 한다. 이들 사이에 통신 연결(communication link)이 설정되어야 한다.

 

하나의 링크와 send(), receive() 연산을 논리적으로 구현하는 방법

  • 직접 또는 간접 통신
  • 동기식 또는 비동기식 통신
  • 자동 또는 명시적 버퍼링

 

명명

- 직접 통신하에서, 통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시해야 한다.

  • 통신을 원하는 각 프로세스의 쌍들 사이에 연결이 자동으로 구축된다. 프로세스들은 통신하기 위해 상대방의 신원만 알면 된다.
  • 연결은 정확히 두 프로세스 사이에만 연관된다.
  • 통신하는 프로세스들의 각 쌍 사이에는 정확하게 하나의 연결이 존재해야 한다.

 

- 간접 통신에서 메시지들은 메일박스(mailbox) 또는 포트(port)로 송신되고, 수신된다.

  • 한 쌍의 프로세스들 사이의 연결은 이들 프로세스가 공유 메일박스를 가질 때만 구축된다.
  • 연결은 두 개 이상의 프로세스들과 연관될 수 있다.
  • 통신하고 있는 각 프로세스 사이에는 다수의 서로 다른 연결이 존재할 수 있고, 각 연결은 하나의 메일박스에 대응된다.

동기화

- 메시지 전달은 봉쇄형이거나 비봉쇄형 방식으로 전달된다. => 동기식 / 비동기식

- send()와 receive()가 모두 봉쇄형일 때, 우리는 송신자와 수신자 간에 랑데부를 하게 된다.


버퍼링

- 통신이 직접적이든 간접적이든 간에, 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어 있따. 기본적으로 이러한 큐를 구현하는 방식은 아래와 같이 세 가지가 있다.

  • 무용량 : 큐의 최대 길이가 0이다. => 대기하는 메시지들을 가질 수 없다. => 송신자는 수신자가 메시지를 수신할 때까지 기다려야 한다.
  • 유한 용량 : 큐는 유한한 길이 n을 가진다. => 새로운 메시지가 전송될 때 큐가 만원이 아니라면 메시지는 큐에 놓이며 송신자는 대기하지 않고 실행을 계속한다. 링크는 유한한 용량을 가진다. => 링크가 만원이면 송신자는 큐 안에 공간이 이용 가능할 때까지 반드시 봉쇄되어야 한다.
  • 무한 용량 : 잠재적으로 큐는 무한한 길이를 가진다. => 송신자는 절대 봉쇄되지 않는다.

- 무용량의 경우 때때로 버퍼가 없는 메시지 시스템이라고 부른다. 다른 경우들은 자동 버퍼링이라 불린다.