Inter-Process Communication(IPC) 프로세스 간 통신

Chan Young Jeong·2023년 3월 1일
0

운영체제

목록 보기
4/11
post-thumbnail

Inter-Process Communication(IPC)

프로세스간 소통 방법을 IPC라고 합니다. 여기서 프로세스는 크게 독립적인 프로세스와 협력적인 프로세스로 나뉩니다. 즉 IPC는 프로세스가 다른 프로세스와 협력(통신)하는 방법을 의미합니다.

Processes executing concurrently in the operating system may be
either independent processes or cooperating processes.

A process is independent if it cannot affect or be affected by the other processes executing in the system.

A process is cooperating if it can affect or be affected by the other processes executing in the system. Clearly, any process that shares data with other processes is a cooperating process.

There are several reasons for providing an environment that allows process cooperation. 그리고 프로세스 협력이 필요한 이유에 대해 알아봅시다. ▼

IPC가 필요한 이유에 대해 알아보자.

정보 공유

: Since several users may be interested in the same piece of information (for instance, a shared file), we must provide an environment to allow concurrent access to such information.

계산 속도 증가

: If we want a particular task to run faster, we must break it into subtasks, each of which will be executing in parallel with the others.

모듈성

: We may want to construct the system in a modular fashion, dividing the system functions into separate processes or threads.

편리성

: Even an individual user may work on many tasks at the same time. For instance, a user may be editing, printing, and compiling in parall.

크게 정보 공유, 계산 속도 증가, 모듈회, 편리성 등에 대한 이유로 프로세스간 협력이 필요합니다.

따라서 Coopertating Process가 Coperation을 하려면 데이터와 정보를 교환해야 합니다. 그러기 위해서는 Inter-Process Communication이 필요합니다.
※ 일반적으로 각 프로세스에 할당된 메모리 공간은 고유하기 때문에 직접 다른 프로세스가 접근할 수 없습니다.

프로세스 간 통신 의 대표적인 Model

IPC에는 기본적으로 두 가지 모델이 있습니다. 공유 메모리(a)와 메시지 전달(b)입니다.

공유 메모리(Shared Memory)

  • 협력 프로세스간 공유되는 메모리를 생성 후 이용하는 것을 의미합니다. 그 영역에 데이터를 쓰고 읽고 함으로써 정보를 교환할 수 있습니다.
  • 데이터의 형식과 위치는 프로세스들에 의해 결정되며 운영체제의 소관이 아닙니다. 또한 프로세스들은 동시에 동일한 위치에 쓰지 않도록 책임을 져야 합니다.
  • 성능은 좋지만 프로세스간 동기화 문제가 발생합니다.(어플리케이션에서 직접 동기화를 해야함.)
#define BUFFER_SIZE 10

typedef struct{
	...
}item

item buffer[BUFFER_SIZE];
int in = 0 ;
int out = 0 ;

The producer process code using 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;

}

The consumer process code using shared memory

item next_consumed;

whie(true){
	
    while(in == out) 버퍼가 비어있는 것
    	; /*do nothing*/
    
    next_consumed = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    /*Consume the item in next_consumed*/

}

Message Passing

  • 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그들의 동작을 동기화할 수 있도록 하는 기법을 제공합니다.
  • OS가 프로세스간 통신 방법을 제공. 메모리 관리를 위해 대리 전달해주는 것을 의미합니다.
  • OS가 동기화를 해주기 때문에 안전하고 동기화 문제가 없습니다. 하지만 시스템 콜을 사용하기 때문에 성능이 떨어지는 단점이 있습니다.
  • send(message)
  • receive(message)

그냥 shared memory는 OS가 처리하고 개발자는 단순히 send, receive만 하고 싶다는 것.

The producer process code using messasge passing

item next_produced;

while(true){
	
    /*produce an item in next_produced*/
    
  	send(next_produced);

}

The consumer process code using messasge passing

item next_consumed;

whie(true){
	
 	receive(next_consumed)
    
    /*Consume the item in next_consumed*/

}

direct vs indirect communication

direct communication은 A가 커널에 메시지를 전달하고 그걸 커널이 B에게 전달하는 것입니다.
indirect communication은 mail box(혹은 port)를 두고 A는 커널한테 '메일 박스에 메시지 둘테니까 B한테 메시지 전달해 줘'라고 하면 B는 그 메일 박스에 가서 메시지를 읽는 방식입니다.

즉 둘 다 커널을 이용하지만 커널이 직접 주냐 안 주냐로 방법이 나뉘는 겁니다.

Different design options for implementation

blocking or non-blocking(synchronous or asynchronous)

  • Blocking send : 송신자는 수신자가 메시지를 받을 때까지 blocked 되는 것
  • Non-blocking send : 송신자는 메시지를 보내고 자기 할 일 하는 것
  • Blocking receive : 수신자는 메시지가 모두 다 받을 때까지 blocked 되는 것
  • Non-blocking receive : 수신자가 메시지가 왔는지 수시로 검사하는 것 (the receiver retrieves either a valid message or a null message )

출처

Operating System Concepts,10th Ed. feat Silberschatz et al. (공룡책)
https://dkswnkk.tistory.com/398
https://doitnow-man.tistory.com/110

0개의 댓글