본문 바로가기

컴퓨터 공학 전공/시스템 프로그래밍

IPC

728x90

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 한다.

'컴퓨터 공학 전공 > 시스템 프로그래밍' 카테고리의 다른 글

time management  (0) 2020.04.01
Memory Mapped File  (0) 2020.04.01
signal  (0) 2020.04.01
record lock  (0) 2020.04.01
Pipe  (0) 2020.04.01