IPC
프로세스들 사이에 서로 데이터를 주고받는 행위.
- PIPE
- Named PIPE
- Message Queue
- Shared Memory
- Memory Map
- Socket
- Semaphore
PIPE
- 파이프는 두 개의 프로세스를 연결하고 하나의 프로세스는 데이터를 쓰기만 하고, 다른 프로세스는 데이터를 읽기만 함.
- 부모 자식(프로세스) 간에 단방향 통신으로 자주 사용.(한쪽 방향으로만 통신이 가능한 PIPE의 특징 때문에 Half-Duplex(반이중) 통신)
- 읽기/쓰기, 즉 송/수신을 모두 하기 원한다면 두 개의 파이프를 만들어야 함.
- read()와 write()가 기본적으로 block mode로 작동되기에 프로세스가 read 대기중이라면 read가 끝나기전에는 write를 할 수 없음.
장점
- PIPE는 간단하게 사용할 수 있음.
- 한쪽 프로세스는 단지 읽기만하고 다른 프로세스는 단지 쓰기만 하는 단순한 데이터 흐름에 적합.
단점
- Full-Duplex(전이중) 통신 방식으로 활용하려면 PIPE를 두개 만들어야 하는데, 구현이 꽤나 복잡해 질 수 있음.
- buffer가 상대적으로 작기때문에 overflow 유발.
- 부모 자식 관계의 프로세스들 사이에서 가능.
Named PIPE
- 통신을 할 프로세스가 명확히 알 수 있는 경우 사용.
- 부모프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능, 프로세스간에 통신을 위해 이름이 있는 파일을 매개체로 사용.
- mkfifo를 통해 Named PIPE를 생성, mkfifo가 성공하면 이름이 명명된 파일이 생성되고 이를 활용해서 프로세스 간에 통신.
장점
단점
Message Queue
- FIFO(First-In First-Out, 선입선출) 자료구조를 가지는 통신설비로 커널에서 관리.
- 입출력 방식으로보면 위에 Named PIPE와 동일하지만 Named PIPE는 데이터의 흐름이라면 Message Queue는 메모리.
- Message Queue에 쓸 데이터에 번호를 붙힘으로써 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음.
장점
- 비동기 방식이기에 방대한 처리량이 있다면 큐에 넣은 후 나중에 처리 가능.
- 다수의 프로세스들이 큐에 메시지를 보낼 수 있고 다수의 프로세스들이 큐로부터 메시지를 꺼낼 수 있음.
- 분산처리 및 경쟁처리 방식에 사용 가능.
단점
- 메시지 무결성 확보가 안됨.
- Queue에 데이터를 넣고 나오는 과정에서 오버헤드가 발생 가능.
- 데이터가 많이 쌓일수록 추가적인 메모리 자원이 필요.
Shared Memory
- 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당.
장점
- 공유 메모리는 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC중에서 가장 빠르게 작동.
(커널메모리영역에서 관리, 빠르게 접근 가능)
단점
- 메시지 전달 방식이 아니기에 데이터를 읽어야하는 시점을 알 수 없음.
- 커널 설정에 종속적이기에 사용하기전에 커널에서 허용하고 있는 공유메모리 사이즈를 확인 필요.
Memory Map
- 메모리 영역을 공유해서 사용할 수 있도록 허용.
- 열린 파일을 메모리에 맵핑시켜서 공유.
장점
- 데이터가 메모리에 이미 올라와있는 것처럼 간단하게 접근 가능.
- 일반적인 파일 IO에 비해 나은 성능.
- 비동기 IO를 사용하지만 시스템에서 처리해주기 때문에 스레드 문제를 걱정할 필요 없음.
단점
- 일반 파일 IO에 비해 상당히 많은 메모리를 요구.
- 많은 데이터를 얼마나 오랫동안 메모리에 유지할 지 컨트롤할 수 없음.
Socket
- 같은 도메인 내에서 연결 될 수 있고 프로세스들 사이의 통신을 가능.
- 서버에서는 bind, listen, accept 진행해 소켓 연결을 위한 준비.
- 클라이언트에서는 connect을 통해 서버에 요청하고 연결이 수립 된 후에서는 socket에 send 함으로써 데이터를 주고 받음. (연결이 끝나면 반드시 close()로 clear)
-네트워크를 통해 프로세스간에 통신을 진행한다
장점
- 서버/클라이언트 환경을 구축하는데 용이.
- 범용적인 IPC로써 양방향 통신이 가능.
- 패킷 단위로 주고 받음으로 직관적으로 이해하기 쉬운 코드를 만들 수 있음.
단점
- Internet UDP와는 달리 경로를 지정할 수 없음.(다중의 클라이언트를 받아들이는 서버의 경우 문제가 될 수 있음)
Semaphore
- 프로세스 간 데이터를 동기화하고 보호하는데 그 목적이 있음.
- 운영 체계 또는 프로그램 작성 내에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호.
장점
- 많은 Thread들은 크리티컬 섹션을 허락받아야 사용 가능.(크리티컬 섹션끼리충돌 발생 하지 않음, 동기화)
단점
- 많은 Thread들은 block을 당할 수 있음. 즉, CPU가 가만히 waiting하는 시간 낭비가 발생.
정리
IPC 종류 | PIPE | Named PIPE | Message Queue | Shared Memory | Memory Map | Socket |
---|
공유 매개체 | 파일 | 파일 | 메모리 | 메모리 | 파일+메모리 | 소켓 |
통신 단위 | Stream | Stream | 구조체 | 구조체 | 페이지 | Stream |
통신 방향 | 단방향(부모-자식) | 단방향 | 단방향 | 양방향 | 양방향 | 양방향 |
통신 범위 | 동일 시스템 | 동일 시스템 | 동일 시스템 | 동일 시스템 | 동일 시스템 | 동일 +외부시스템 |
ref:) https://www.byfuls.com/programming/read?id=63