미래와 연결될 첫걸음

Interprocess Communication(IPC) #3.4 Message-Passing 1 본문

Infra/OS

Interprocess Communication(IPC) #3.4 Message-Passing 1

Traveler:) 2019. 7. 1. 21:45

● Messasge - Passing Systems

   Shared Memory와 다르게 공유할 공간이 필요없습니다. 이 system이 메세지를 보내면서 두 process간에 소통합니다.

마치 채팅 프로그램인 카카오톡처럼요! Messasge - Passing을 하기 위해서는 두 가지 기능이 필요합니다.

바로, send(message)receive(messsage)입니다. 여기서 보내지는 message-size는 고정된 것이거나, 변수일 수 있습니다.

( size가 고정된 message는 system-level에서는 간단합니다. 그러나, 프로그램 실행면에서는 어렵습니다.

  size가 바뀌는 message는 system-level에서는 복잡하지만, 프로그램 실행면에서는 간단합니다. )

 

종이컵에 실을 연결해서 전화놀이를 했던 경험들이 있으실겁니다. 이 두 종이컵에 말하는 것을 send라고 생각하고, 듣는 것을 receive라고 생각해봅시다. 이렇게 멀리 떨어져있는 종이컵에 말을 하고 귀를 갖다 대어 전화처럼 소통이 가능한 이유는 바로 때문입니다. 

여기서도 마찬가지입니다. 실 역활을 해주는 것이 바로 link입니다. 소통을 하기 위해서 어떤 두 processes간에는 link로 연결되어 있어야합니다. 이 link를 하는 방법은 몇 가지가 있습니다.

       - Direct or indirect communication (오늘은 이 부분만 살펴볼 것입니다.)

       - Synchronous or asynchronous communication (*synchronous :동시 발생하는 , asynchronous: 동시 발생하지 않는)

       - Automatic or explicit buffering

이에 대해 좀 살펴보겠습니다. 

 

    Naming: processes끼리 communication을 하기 위해서는 명시적으로 서로 부를 수 있는 이름이 있어야 합니다.

 

         - sender : message를 보내는 process, send( process_A, message )

         - recipient : message를 받는 process, receive( process_B, message )

 

    이렇게 되면, process_A와 process_B 자동적으로 둘 사이에는 link가 딱 하나만 생깁니다.

    이렇게 processes끼리 직접 link되어 communication하는 것을 direct communication이라 합니다.

 

    또, 위와 같이 두 process서로의 process 이름을 알고 communication하는 것을 symmetry라고 합니다.. 그렇다면, communucation을 할 때마다 process의 이름을 알아야 하는가? 그건 아닙니다. recipient입장에서는 오는 message만 받으면 될 것입니다. 그래서 sender는 recipient의 이름을 알아야 하지만, recipient는 누가 보내는지 sender의 이름을 몰라도 됩니다. 이를 asymmetry라고 합니다. 

 

    send ( process_A, message) -----> receive (id, message)   이런 꼴이죠.

 

    indirect commuincation은 processes끼리 직접 communication을 하는 것이 아니라 mailboxes or ports를 통해 message를 주고 받는 것입니다. 이 mailbox는 unique한 id가 있어서 이 id로 message를 보내고 받습니다.

     send ( mailbox_id, message) -----> receive ( mailbox_id, message ) 이런 모양입니다. 이를 사용하면, 몇가지 특성이 있습니다.

 

     1. 같은 mailbox id를 가진 process들 끼리 link가 된다.

     2. link가 두 process보다 더 많은 process와 연관이 있을 수 있다. ( Link가 여러개 생길 수 있다.)

     3. link가 다르더라도 각 link는 한 mailbox에 해당한다. (즉, Link는 다르지만 같은 mailbox를 가진다.)

 

조그만 더 깊게 생각해보겠습니다.

만약에 Process_A, Process_B, Process_C가 있고 mailbox 1개가 있다고 가정해봅시다. Process_A가 "Hello world!"라는 message를 mailbox로 보냈습니다. 그러면 Process_B와 Process_C 중에서 어떤 Process가 receive()를 실행하여 mailbox에서 "Hello world!" 메세지를 받을까요?

 

여기에 답이 있습니다.

     무작위로 두 process 중 아무거나 선택해서 message를 받습니다. 그러나 정말 무작위로 받는 것은 아니고, 받는 algorithm에 따라 결정됩니다. 이 algorithm은 나중에 뒤에서 배울 것입니다.

 

오늘은 direct communicationindirect communication에 대해 살펴보았습니다.

남은 나머지 두개는 다음에 살펴보겠습니다.