운영체제 OS

[운영체제/OS] Interprocess Communication (IPC)란?

프로세스들은 independent독립적일 수도 있고 cooperating상호협조적일 수도 있습니다.

 

cooperating한 프로세스들은 공유data를 포함해 프로세스들끼리 영향을 줘요. 

정보공유, 속도향상, 모듈화의 목적을 가지고 있습니다.

 

이를 위해 Interprocess Communication (IPC)를 필요로 하는데요

IPC는 두 가지 모델, Shared memory와 Message Passing이 있습니다. 

two communication models

Shared Memory 모델

프로세스들이 공유하고 싶은 메모리의 영역이 있을거에요. 

communication 에 대한 컨트롤은 OS가 아닌 user 프로세스들이 가지고 있습니다.

가장 중요한 점은 shared memory 에 대해 user 프로세스들이 synchronize(동기화)를 허용한다는 것이에요.

이후의 게시글에서 이 "동기화"에 대해 더 자세히 다루어볼거에요.

 

shared memory에 대한 IPC는 producer 프로세스와 consumer 프로세스가 있어요.

생산자-소비자 문제는 공유 메모리를 사용하여 해결합니다.

동시에(concurrently)수행하고 공유메모리(버퍼)를 통해 상호통신을 해요.

생산자는 item을 생산하고 이를 버퍼에 저장하면, 소비자는 이 버퍼에 있는 item을 소비해요. 

가용한 항목이 있을 때만 소비가 이루어지도록, 생산자/소비자 프로세스는 동기화되어야 합니다. 

 

 

Message Passing 모델

프로세스들끼리 대화하고 동기화가 이루어지도록 하는 메커니즘이에요.

IPC는 두 가지 동작을 제공해요: send(message)와 receive(message) 

메시지의 사이즈는 고정이나 가변입니다. 

프로세스 P와 Q가 communicate 하고 싶다면, communication link를 만들어 send/receive를 통해 메시지 교환합니다.

이 communication link는 

physical하게는 shared memory, hardware bus, network

logical 하게는 direct or indirect, synchronous or asynchronous, automatic or explicit buffering

하게 실행됩니다.

 

Direct Communication (1대 1통신)

프로세스들은 각자의 이름을 explicity(명확히) 명시합니다.

-send(P, message): P로 메시지를 보내라

-receive(Q, message): Q로부터 메시지를 받아라.

한 쌍에는 하나의 링크만 존재하고, 링크는 자동적으로 생성되요.

 

Indirect Communication (多대 多통신)

메시지들이 mailbox(또는 ports) 로부터 send와 receive가 이루어져요.

각 mailbox는 고유의 id를 가지고 

-send(A, message) : mailbox A 로 메시지를 보내라.

-receive(A, message): mailbox A로부터  메시지를 받아라. 

 

그래서 프로세스 P1, P2, P3가 하나의 메일박스 A를 공유할 수 있다는 것이죠.

P1은 send하고 P2와 P3는 receive하고 하면 누가 message를 받나요?

--> 한번에 하나의 프로세스만 receive 동작을 하도록 설정하거나 시스템이 인위적으로 receiver을 선택하도록 해결하기(sender는 receiver가 누구였는지 알림을 받고)

 

 

Synchronization(동기화)

Blocking은 synchronous합니다. 

  Blocking send - sender는 메시지를 받을 때까지 기다리고(blocked)

  Blocking receive - reveiver는 메시지가 있을 때까지 기다린다(blocked)

Non-blocking은 asynchronous합니다.

  Non-blocking send - sender는 메시지를 보내고 계속 이어서 하고

  Non-blocking receive - receiver는 valid 메시지나 null를 받습니다

 

 

 

Pipes 파이프 통신

두 프로세스가 통신하도록 하는 연결통로 역할

Ordinary pipes: parent와 child 사이 연결통로로 주로 사용 (바깥의 그외 다른 프로세스들은 접근못함)

Named pipes: 그 외의 관계에서 사용되고 접근됨

ordinary pipe

named pipe에선 parent-child관계가 필요없어요. mkfifo()로 생성되고 open(), read(), write(), close()를 사용합니다.