프로세스 간 통신 IPC
IPC (Interprocess Communication)
- 리눅스 커널의 구조를 보면 process는 완전히 독립된 실행 객체이다.
- 서로 독립되어있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있다.
- 그러나 서로 간의 통신이 어렵다는 문제가 존재한다.
- 이를 위해서 커널 영역에서 IPC라는 내부 프로세스 간 통신을 제공하고,
- 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스 간 통신을 한다.
IPC설비들
PIPE(익명 PIPE)
- 파이프로 두 개의 프로세스를 연결하고
- 하나의 프로세스는 데이터를 Write
- 다른 하나는 데이터를 Read만 한다.
- 한쪽 방향으로만 통신이 가능하기 때문에 Half-Duplex(반 이중 통신)이라고 부른다.
- 송/수신을 모두 하길 원한다면 두 개의 파이프를 만들어야 한다.
- 같은 PPID를 가지는 프로세스들 사이에서만 통신이 가능하다.
Named PIPE(FIFO)
- 익명 파이프는 통신을 할 프로세스를 명확하게 알 경우에 사용하고,
- Named PIPE는 전혀 모르는 상태의 프로세스들 간의 통신에 이용한다.
- Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능하다.
- 프로세스 통신을 위해 이름이 있는 파일을 사용하기에 가능한 일이다.
- 하지만, PIPE와 동일하게 읽기/쓰기가 동시에 불가능하다.
Message Queue
- Queue는 선입 선출의 자료구조로 커널에서 관리한다.
- 입출력 방식은 Named PIPE와 동일하지만, Named PIPE는 데이터의 흐름이라면
- 메시지 큐는 메모리 공간이라는 점이 다르다.
- 장점은 메시지큐에 쓸 데이터에 번호를 붙여서 여러 개의 프로세스가 동시에 데이터를 다룰 수 있다.
Shared Memory
- 데이터를 공유하는 방법은 두 가지가 있다.
- 통신을 이용해서 데이터를 주고 받는 것
- 데이터 자체를 공유하는 것
- 위의 세 가지는 통신을 이용한 설비라면, 공유메모리는 데이터 자체를 공유하도록 지원하는 설비이다.
- 프로세스는 자신의 메모리 영역이 있고, 커널에 의해서 보호된다.
- 공유 메모리는 프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
- 중개자 없이(통신 등..) 바로 메모리에 접근하기 때문에 다른 IPC보다 빠르게 작동한다.
Memory Map
- 공유 메모리와 마찬가지로 메모리를 공유하지만, 열린 파일을 메모리에 맵핑시켜서 공유한다는 점이 다르다.
Socket
- 프로세스들 사이의 통신을 가능하게 한다.
- 서버 - 클라이언트 통신에 주로 사용한다.
Semaphore
- 다른 IPC 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는 데 반해,
- 세마포어는 프로세스 간 데이터를 동기화하고 보호하는 목적으로 사용한다.
- 프소세스 간 통신을 할 때 데이터를 공유함으로써 발생하는 문제를 해결한다.
- 공유 자원에 동시 접근을 막는다.
출처 : https://jwprogramming.tistory.com/54