이번 시간에는 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는 아래와 같이 정의될 수 있어.
- send(B, message) - 프로세스B에게 message를 전달
- receive(A, message) - 프로세스B가 message를 받았다는 사실을 전달
위와 같이 발신자와 수신자 둘 다 서로의 이름을 표시하면 이를 symmetry라고 해. 만약, 발신자만 수신자의 이름을 표기하고 수신자는 아무것도 표기하지 않으면 asymmetry라고 해. 이 때, send()와 receive() primitives는 아래와 같이 정의될 수 있어.
- send(B, message) - 프로세스B에게 message를 전달
- receive(id, message) - 어떤 프로세스로부터 message를 받음. 수신자의 id값을 함께 넘김.
Indirect communication의 상황에서는 메세지가 mailboxes or ports로 이동하게 돼. Mailbox는 하나의 추상적인 object이고 그 안에서 메세지가 프로세스들에 의해 도착하고 지워져. 이 또한 primitives로 나타내보자.
- 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 |