05. 프로세스 간 통신

공룡책 ch03. Process -3-

IPC: Inter-Process Communication

프로세스 간 통신: 서로 다른 프로세스 간의 데이터가 공유(영향을 주고 받음)될 때 필요한 메커니즘 혹은 그런 행위


IPC의 두 가지 기본적인 모델

1. Shared-Memory

통신하고 있는 프로세스가 모두 접근할 수 있는 메모리 공간을 둠

Producer-Consumer Problem

  • 프로듀서 프로세스와 컨슈머 프로세스는 동시에 실행됨
  • 프로듀서 프로세스는 버퍼에 데이터를 채우고 컨슈머 프로세서는 버퍼를 비움
  • 프로듀서 프로세스의 메모리에 컨슈머 프로세스가 접근하게 하거나 컨슈머 프로세스의 메모리에 프로듀서 프로세스가 접근할 수 있다면 문제가 생김.
  • 따라서 각 메모리는 private하게 두고 따로 버퍼로 Shared memory를 별도로 두어 문제를 해결할 수 있음

shared_memory 구현

프로듀서 프로세스 코드

item next produced;
while (true) {
	/* produce an item in next produced */
	while (((in + 1) % BUFFER SIZE) == out)
		; /* do nothing */
        
	buffer[in] = next produced;
	in = (in + 1) % BUFFER SIZE;
}

컨슈머 프로세스 코드

item next consumed;
while (true) {
	while (in == out)
		; /* do nothing */
	next consumed = buffer[out];
	out = (out + 1) % BUFFER SIZE;
	/* consume the item in next consumed */
}

두 코드는 동시에 수행된다.
프로듀서는 item을 버퍼에서 in 포인터가 가리키는 곳에 채우고 그와 동시에 컨슈머는 out 포인터가 가리키는 곳에서 다음 소비할 item을 가져온다.

버퍼는 원형 큐 자료구조에서 isFull과 isEmpty 메소드 내의 조건들을 떠올리면 좋다.
((in + 1) % BUFFER SIZE) == out인 경우 다음 생산하여 채울 곳을 out이 이미 가리키고 있으므로 버퍼가 꽉찬 상태이므로 프로듀서는 생산을 멈춘다.
마찬가지로 in == out인 경우 버퍼가 비어 있으므로 컨슈머는 소비를 멈춘다.


2. Message-Passing

커널(OS)가 프로세스 간의 데이터(메시지) 공유를 도와줌. os가 알아서 해주므로 편하지만 shared-memory 방식보다 느림
프로세스는 메시지를 보내거나(send) 받을 수(receive) 있음

direct and indirect communication

  • direct: 프로세스가 상대 프로세스를 알고 있어 메시지를 보내거나 받을 때 해당 프로세스를 명시할 수 있음

    • send(P, message): send a message to process P
    • receive(Q, message): receive a message from process Q
    • 커뮤니케이션 링크가 자동으로 생성된다.
    • 정확하게 2개의 프로세스 간의 하나의 링크만 생성됨
  • indirect: 메시지를 메일박스 혹은 포트 port라고 부르는 것에 보내고 받음

    • send(A, message): send a message to port A
    • receive(A, message): receive a message from port A
    • 포트와 연결될 때만 링크가 생성됨
    • 2개보다 많은 프로세스가 연결될 수 있음
    • os는 메일박스를 create, send, receive, delete 기능을 지원하면 됨

synchronous and asynchronous communication

os에서 실제 메일박스를 구현할 때 선택하는 방식
synchronous = blocking
asynchronous = non-blocking

Blocking send: sender가 메시지가 receive가 완료될 때까지 블록됨(멈춰있음)
Non-blocking send: sender가 메시지를 보낸 이후에도 블록되지 않고 컨티뉴
Blocking receive: receiver가 메시지를 다 받아 available할 때까지 블록됨
Non-blocking receive: receiver가 블록되지 않고 작업을 계속함

좋은 웹페이지 즐겨찾기