IPC란?

Inter Process Communication 의 약자로 프로세스간 통신을 말합니다.

위 그림처럼 프로세스는 완전히 독립된 실행객체로써 다른 프로세스의 영향을 받지 않습니다. 독립되어 있는 만큼 별도의 설비가 없이 서로간의 통신이 어려워, 커널 영역에서 IPC라는 내부 프로세스 간 통신을 제공하여 프로세스는 커널이 제공하는 IPC설비를 이용해서 프로세스 간 통신을 가능하게 합니다. 

 

IPC 설비들

상황에 맞는 IPC의 선택은, 특히 fork()를 이용해서 만들어진 멀티 프로세스의 프로그램에 있어서 중요합니다. 잘못된 IPC 설비의 선택은 코딩과정을 어렵게 만들거나 프로그램의 작동을 효율적이지 못하게 만들 수 있습니다. 이러한 설비 종류로는 PIPE, Named PIPE, Message Queue, Shared Memory, Memory Map, Socket 등이 있습니다. 

 

1. PIPE

익명의 PIPE를 통해서 동일한 부모 프로세스를 가진 프로세스들 간에 단방향 통신을 지원합니다.

FIFO 구조이며 생성된 PIPE에 대하여 Write 또는 Read 만 가능하게 됩니다.

부모-자식 프로세스간 통신할 때 사용하게 됩니다.

쌍방통신을 위해서는 WritePIPE하나 Read PIPE하나를 따로 만들어야 합니다. read()write()가 기본적으로 block 모드로 작동하기 때문에 프로세스가 read가 대기중이라면 read가 끝나기 전에는 write를 할 수가 없게 됩니다.

 

2. Named PIPE

이름을 가진 PIPE를 통해서 프로세스들 간에 단방향 통신을 지원하며 서로 다른 프로세스들이 PIPE 이름만 알면 통신이 가능합니다.

익명의 PIPE와 마찬가지로 FIFO 구조이며 생성된 PIPE에 대하여 Write 또는 Read 만 가능하게 됩니다.

전혀 다른 모든 프로세스들 사이에서 통신이 가능한데 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문입니다. Named PIPE의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성됩니다.

마찬가지로 쌍방 통신을 위해서는 WritePIPE하나 Read PIPE 하나를 따로 만들어야 합니다. read()write()가 기본적으로 block 모드로 작동하기 때문에 프로세스가 read대기중이라면 read가 끝나기 전에는 write를 할수가 없게 됩니다.

 

3. Message Queue

파이프가 아닌 어디에서나 물건을 꺼낼 수 있는 컨베이너 벨트와 유사하며 컨베이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있습니다.

입출력 방식으로는 익명 PIPE와 동일하지만, 커널에서 관리하며 메모리를 사용한 PIPE 입니다. 구조체 기반으로 통신을 합니다.

FIFO 구조이며, msgtype에 따라 다른 구조체를 가져올 수 있습니다.

프로세스간 다양한 통신을 할 때 사용할 수 있습니다.

커널에서 제공하는 Message queue 이기 때문에 EnQueue 하는데 제한이 존재합니다.

 

4. Shared Memory

위 설비들과는 다르게 공유메모리가 데이터 자체를 공유하도록 지원하는 설비입니다. 

프로세스는 자신만의 메모리 영역을 가지고 있고 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해서 보호되지만 메모리 영역에 있는 데이터를 다른 프로세스도 사용할 수 있도록 해야할 경우도 필요합니다. 위 설비들과 같이 PIPE 등을 이용해서 데이터 통신을 이용하여 데이터를 전달하는 방법도 있겠지만, Thread에서 처럼 메모리 영역을 공유한다면 더 편하게 데이터를 함께 사용할 수 있습니다. 

프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줍니다. 이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있습니다.

공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동할 수 있다. 단순히 공유 메모리를 point 함으로써 프로세스에서 사용되는 메모리가 증가되지 않습니다.

프로세스간의 Read, Write 를 모두 필요로 할 때 사용하게 됩니다. 

 

5. Memory Map

운영체제에서 파일을 다루는 방법 중 하나로써 Memory MapShared Memory 공간과 마찬가지로 메모리를 공유한다는 측면에 있어서는 서로 비슷한 측면이 있습니다. 차이점은 Memory Map의 경우 열린파일을 메모리에 맵핑시켜서, 공유한다는 점입니다프로세스의 가상 메모리 주소 공간에 파일을 매핑한 뒤 가상 메모리 주소에 직접 접근하는 것으로 파일 읽기/쓰기를 대신합니다.

운영체제에서 페이징 기법을 사용하여 파일의 내용을 관리하며 페이지 크기에 따라 적절히 파일의 내용을 읽고 쓸 수 있습니다.

파일로 대용량 데이터를 공유할 때 사용되며, 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맵 파일을 이용합니다. 

 

6. Socket

같은 도메인 내에서 연결될 수 있고 프로세스들 사이의 통신을 가능하게 합니다. 서버단에서는 bind, listen, accept를 진행해 소켓 연결을 위한 준비를 합니다. 클라이언트 단에서는 connect를 통해 서버에 요청하고 연결이 수립된 후에는 socket에 send 함으로써 데이터를 주고 받습니다. 연결이 끝난 후에는 반드시 Socket close()해주어야 합니다. 

범용적인 IPC로써 양방향 통신이 가능하며 패킷 단위로 주고 받음으로 직관적으로 이해하기 쉬운 코드를 만들 수 있습니다.

 

요약

IPC 종류 PIPE Named PIPE Message Queue Shared Memory Memory Map Socket
용도 부모 자식간 단방향 통신 다른 프로세스와 단방향 통신 다른 프로세스와 단방향 통신 다른 프로세스와 양방향 통신 다른 프로세스와 양방향 통신 다른 시스템간 양방향 통신
공유 매개체 파일 파일 메모리 메모리 파일+메모리 소켓
통신단위 stream stream 구조체 구조체 페이지 stream
통신방향 단방향 단방향 단방향 양방향 양방향 양방향

 

반응형

+ Recent posts