프로세스간 소통 방법을 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. 그리고 프로세스 협력이 필요한 이유에 대해 알아봅시다. ▼
: 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이 필요합니다.
※ 일반적으로 각 프로세스에 할당된 메모리 공간은 고유하기 때문에 직접 다른 프로세스가 접근할 수 없습니다.
IPC에는 기본적으로 두 가지 모델이 있습니다. 공유 메모리(a)와 메시지 전달(b)입니다.
#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*/
}
그냥 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 communication은 A가 커널에 메시지를 전달하고 그걸 커널이 B에게 전달하는 것입니다.
indirect communication은 mail box(혹은 port)를 두고 A는 커널한테 '메일 박스에 메시지 둘테니까 B한테 메시지 전달해 줘'라고 하면 B는 그 메일 박스에 가서 메시지를 읽는 방식입니다.
즉 둘 다 커널을 이용하지만 커널이 직접 주냐 안 주냐로 방법이 나뉘는 겁니다.
Operating System Concepts,10th Ed. feat Silberschatz et al. (공룡책)
https://dkswnkk.tistory.com/398
https://doitnow-man.tistory.com/110