IPC

Jin·2022년 2월 27일
0

IPC는 Inter Process Communication의 약자로, 프로세스 간 통신을 뜻합니다.

앞서 살펴봤듯이, Pipe 외에도 많은 방법들이 존재합니다. 이번 게시글에서는 IPC의 수단들을 구체적으로 다뤄보려고 합니다.

Message Queue

구조는 위와 같은 형태입니다. 언뜻 보면 pipe와 비슷하다고 생각할 수 있습니다. 허나 중요한 차이점은 위와 같은 구조가 pipe는 데이터의 흐름이라면 message queue는 메모리 공간에 존재한다는 것입니다. 또한, 두 프로세스 간이 아닌 여러 프로세스들이 활용할 수 있습니다. message queue를 사용하기 위해 쓰이는 함수들은 다음과 같습니다.

int msgget (key_t key, int msgflg)

key에는 message queue의 key가 들어갑니다, msgflg에는 create, open이 들어가서 queue를 열거나 생성합니다. 정상적인 경우라면 message queue의 id가 반환되고 error시 -1이 반환됩니다.

int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)

msgp에 user message pointer가, msgsz에는 message size, msgflg에는 blocking, non-blocking 설정을 할 수 있습니다. 정상적인 경우 0을, error시 -1을 반환합니다. pipe의 write처럼 message queue의 msgsnd를 통해 message queue에 내용을 넣습니다.

int msgrcv (int msqid, void *msgp, size_t msgsz, long msgtype, int msgflg)

msgtype에 message의 type이 들어갑니다. type > 0이면 type이 동일한 message들 중에 가장 먼저 들어간 것을 꺼내는 것입니다. type == 0이면 전체 message 중에서 가장 먼저 들어간 것을 꺼냅니다. type < 0이면 가장 낮은 값을 가지고 type의 첫 번째 message를 꺼냅니다. 정상적인 경우 0을, error시 -1을 반환합니다.

msgsnd든 msgrcv든 먼저 msqid를 찾아야 하므로 msgget을 해야 합니다.

이렇게 qid를 찾고 난 다음,

이런 식으로 send 혹은 receive를 합니다. 당연히 mymsg는 message가 담겨져 있는 문자열 or 포인터입니다.


Shared memory

여러 프로세스들이 하나의 메모리 공간을 공유할 수 있도록 함으로써 정보를 주고받을 수 있게 만든 메모리 공간입니다.

shared segment는 각 프로세스의 heap에 자리잡는데 그 위치는 프로세스마다 다릅니다. 하지만 key 값을 통해 어떤 프로세스에서 shared memory에 read, write 하면 다른 프로세스에도 즉각 반영됩니다.

int shmget (key_t key, int size, int shmflg)

shared memory의 id (key)를 얻는 함수입니다.

void shmat (int shmid, void shmaddr, int shmflg)

shared segment를 address에 attach하는 함수입니다. 반환 값으로 shared segment가 mapping 된 address를 줍니다.

int shmdt (void *shmaddr)

shmaddr에 앞의 shmat 함수에서 반환된, mapping된 address를 주면 그걸 detach 합니다.

shm-producer는

이런 식으로 shmget을 통해 shmid을 받아와서, shmat의 반환 값에 해당하는 shmaddr를 받고 임시로 tempaddr에 shmaddr의 주소 값을 받아서 그 안에 값을 집어넣으면 shared memory에 write가 됩니다. detach 할 때는 shmaddr를 shmdt 합니다.

shm-consumer는

이런 식으로 앞의 producer와 동일하지만 tempaddr에 shmaddr의 주소 값을 받아서 그 안에 있는 값을 읽어 들임으로써 shared memory 안의 내용을 read 합니다.

profile
배워서 공유하기

0개의 댓글