IPC
프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻합니다.
IPC를 사용하는 이유
어떤 로직을 하나의 프로세스로만 수행하는 대신, 여러 프로세스가 수행해서 보다 빠른 성능을 기대할 수 있습니다. 로직을 수행하는 과정에서 필요한 데이터들을 서로 공유할 수 있어야하기 때문에IPC가 필요합니다.
주요 IPC 방식
PIPE
- 익명의 PIPE를 통해서 동일한 부모 프로세스를 가진 프로세스들 간에 단방향 통신을 지원합니다.
- FIFO 구조이며 생성된 PIPE에 대하여 Write 또는 Read 만 가능하게 됩니다.
- 부모-자식 프로세스간 통신할 때 사용하게 됩니다.
- 쌍방통신을 위해서는 Write용 PIPE하나 Read PIPE하나를 따로 만들어야 합니다. read()와 write()가 기본적으로 block 모드로 작동하기 때문에 프로세스가 read가 대기중이라면 read가 끝나기 전에는 write를 할 수가 없게 됩니다.
Named PIPE
- 이름을 가진 PIPE를 통해서 프로세스들 간에 단방향 통신을 지원하며 서로 다른 프로세스들이 PIPE 이름만 알면 통신이 가능합니다.
- 익명의 PIPE와 마찬가지로 FIFO 구조이며 생성된 PIPE에 대하여 Write 또는 Read 만 가능하게 됩니다.
- 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문입니다. Named PIPE의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성됩니다.
- 마찬가지로 쌍방 통신을 위해서는 Write용 PIPE하나 Read PIPE 하나를 따로 만들어야 합니다. read()와 write()가 기본적으로 block 모드로 작동하기 때문에 프로세스가 read대기중이라면 read가 끝나기 전에는 write를 할수가 없게 됩니다.
Message Queue
- 파이프가 아닌 어디에서나 물건을 꺼낼 수 있는 컨베이너 벨트와 유사하며 컨베이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있습니다. 입출력 방식으로는 익명 PIPE와 동일하지만, 커널에서 관리하며 메모리를 사용한 PIPE 입니다. 구조체 기반으로 통신을 합니다.
- FIFO 구조이며, msgtype에 따라 다른 구조체를 가져올 수 있습니다.
- 프로세스간 다양한 통신을 할 때 사용할 수 있습니다.
- 커널에서 제공하는 Message queue 이기 때문에 EnQueue 하는데 제한이 존재합니다.
Shared Memory
- 위 설비들과는 다르게 공유메모리가 데이터 자체를 공유하도록 지원하는 설비입니다.
- 프로세스는 자신만의 메모리 영역을 가지고 있고 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해서 보호되지만 메모리 영역에 있는 데이터를 다른 프로세스도 사용할 수 있도록 해야할 경우도 필요합니다. 위 설비들과 같이 PIPE 등을 이용해서 데이터 통신을 이용하여 데이터를 전달하는 방법도 있겠지만, Thread에서 처럼 메모리 영역을 공유한다면 더 편하게 데이터를 함께 사용할 수 있습니다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줍니다. 이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있습니다.
- 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동할 수 있습니다. 단순히 공유 메모리를 point 함으로써 프로세스에서 사용되는 메모리가 증가되지 않습니다.
- 프로세스간의 Read, Write 를 모두 필요로 할 때 사용하게 됩니다.
Memory Map
- 운영체제에서 파일을 다루는 방법 중 하나로써 Memory Map도 Shared Memory 공간과 마찬가지로 메모리를 공유한다는 측면에 있어서는 서로 비슷한 측면이 있습니다. 차이점은 Memory Map의 경우 열린파일을 메모리에 맵핑시켜서, 공유한다는 점입니다. 프로세스의 가상 메모리 주소 공간에 파일을 매핑한 뒤 가상 메모리 주소에 직접 접근하는 것으로 파일 읽기/쓰기를 대신합니다.
- 운영체제에서 페이징 기법을 사용하여 파일의 내용을 관리하며 페이지 크기에 따라 적절히 파일의 내용을 읽고 쓸 수 있습니다.
- 파일로 대용량 데이터를 공유할 때 사용되며, 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맵 파일을 이용합니다.
Socket
- 같은 도메인 내에서 연결될 수 있고 프로세스들 사이의 통신을 가능하게 합니다. 서버단에서는 bind, listen, accept를 진행해 소켓 연결을 위한 준비를 합니다. 클라이언트 단에서는 connect를 통해 서버에 요청하고 연결이 수립된 후에는 socket에 send 함으로써 데이터를 주고 받습니다. 연결이 끝난 후에는 반드시 Socket 을 close()해주어야 합니다.
- 범용적인 IPC로써 양방향 통신이 가능하며 패킷 단위로 주고 받음으로 직관적으로 이해하기 쉬운 코드를 만들 수 있습니다.
정리
참고
IPC(inter process communication) 종류