본문 바로가기

컴퓨터과학/운영체제(Operating System)

IPC에서 message passing은 무엇일까?

Message passing system

 이번 시간에는 Message-passing system에 대해 공부해볼거야. 이전 글에서 message-passing 모델에 대해 간단하게 보았어. 어떤 특징이 있다고 했지? 메세지를 보내고 읽을 때마다 kernel에 접근하기 때문에 system call이 빈번하여 time-consuming하다고 했어. 기억나지? 좋았어!

 

  • Direct이냐 Indirect communication이냐?
  • Synchronous한가 Asynchronous한 communication인가?
  • Automatic인가 Explicit buffering인가?

 

 오늘은 message passing 모델에 대해 이 3가지 주제를 가지고 이야기해보자.

 프로세스 간 통신은 send() primitive와 receive() primitive로 이루어져 있어. 여기서 primitive라는 건 아주 atomic한 요소라는 뜻이야. Direct communication의 상황에서는 통신하고 싶어하는 프로세스들은 수신자와 발신자의 이름을 명확하게 명시해야 해. send()와 receive() primitives는 아래와 같이 정의될 수 있어.

Symmetric message passing

  • send(B, message) - 프로세스B에게 message를 전달
  • receive(A, message) - 프로세스B가 message를 받았다는 사실을 전달

 위와 같이 발신자와 수신자 둘 다 서로의 이름을 표시하면 이를 symmetry라고 해. 만약, 발신자만 수신자의 이름을 표기하고 수신자는 아무것도 표기하지 않으면 asymmetry라고 해. 이 때, send()와 receive() primitives는 아래와 같이 정의될 수 있어.

Asymetric message passing

  • send(B, message) - 프로세스B에게 message를 전달
  • receive(id, message) - 어떤 프로세스로부터 message를 받음. 수신자의 id값을 함께 넘김.

 Indirect communication의 상황에서는 메세지가 mailboxes or ports로 이동하게 돼. Mailbox는 하나의 추상적인 object이고 그 안에서 메세지가 프로세스들에 의해 도착하고 지워져. 이 또한 primitives로 나타내보자.

Mailbox message passing

  • send(A, message) - mailbox A에게 message를 전달
  • receive(A, message) - mailbox A에게 message를 받음

 프로세스 간 통신은 send()와 receive() primitives로 이루어져 있다고 앞에서 이야기했는데 각각은 여러 디자인이 있고 조합이 가능해. 예를 들어, send()는 blocking인데 receive()는 nonblocking인 것처럼 말이야. 이것은 synchronous이고 asychronous하다고 표현하기도 하지.

Blocking send 수신자 프로세스나 mailbox가 메세지를 받을 때 까지 메세지를 보낼 수 없음
Nonblocking send 발신자 프로세스가 메일을 보내고 다시 자기 일을 함
Blocking receive 메세지가 이용될 수 있을 때까지 아무것도 할 수 없음
Nonblocking receive 수신자 메세지가 valid한 메세지 혹은 null을 복구함

 이제 마지막으로 buffering에 대해 알아보자. Direct하게 통신하든, Indirect하게 통신하든 관계없이 임시의 queue안의 process들이 통신하여 message가 교환되게 돼. 이 때, 이 queue는 다음의 세 가지 방법으로 구현되어 있어.

Zero capacity queue의 buffer가 0이기 때문에 메세지를 보낼 때 마다 block이 된다. 다시 말해, 수신자가 메세지를 받을 때 까지 block된다.
Bounded capacity queue의 길이가 유한인 n이다. 즉, n개의 메세지만 queue에 push할 수 있다. queue의 buffer가 남았으면 메세지를 보낼 수 있지만, 꽉 차면 block이 된다. 수신자가 메세지를 읽어서 queue가 빌 때까지 기다려야 한다. 
Unbounded capacity queue의 길이가 무한대이기 때문에, 발신자는 절대 block되지 않는다

 

 그러면 오늘은 여기까지! 고마워

 

참고한 웹 사이트입니다. 감사합니다.

[1] https://en.wikipedia.org/wiki/Language_primitive

[2] http://www.tutorialsspace.com/Operating-System/23-Interprocess-Communication-Message-Passing.aspx

'컴퓨터과학 > 운영체제(Operating System)' 카테고리의 다른 글

Interrupt와 polling의 차이  (0) 2020.01.15
IPC가 뭐야?  (1) 2020.01.06