IPC(Inter Process Communication)
- 프로세스들 사이에 서로 데이터를 주고받는 행위를 말한다.
- 프로세스는 독립적으로 실행된다. 이처럼 독립적인 공간을 가진 프로세스 간 통신에 사용되는 기법이 IPC 통신이다.
- 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간의 통신을 할 수 있게 된다.
IPC의 2가지 표준(System V IPC와 POSIX IPC)
System V IPC는 오래된 버전이고 POSIX IPC는 비교적 최근에 개발된 표준이다. System V IPC는 오랜 역사를 가진 만큼 이기종간 코드 호환성을 확실히 보장해 주지만, API가 오래되었으며, 함수명도 명확하지 않다. POSIX IPC는 직관적으로 API가 구성되어 있어서 상대적으로 조금 더 사용하기 쉽다고 보여진다.
IPC의 종류
- PIPE (익명 PIPE, Anonymous PIPE)
- 파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다.
- 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 한다.
- PIPE와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하므로 만약 읽기와 쓰기, 즉 송/수신을 모두 하기 원한다면 두개의 파이프를 만들어야만 가능해진다.
- 장점 : 한쪽 프로세스가 단지 읽기만 하고 다른 쪽 프로세스는 단지 쓰기만 하는, 단순한 데이터 흐름에선 PIPE를 사용하는게 좋다.
- 단점 : 반이중 통신이라는 점으로 만약 프로세스가 읽기와 쓰기 통신 모두를 해야 한다면 PIPE를 두개 만들어야 하는데, 이럴 경우 구현이 꽤나 복잡해 질 수 있다. 전이중 통신을 고려해야될 상황에선 알맞지 않다.
- Named PIPE(FIFO)
- 익명 파이프는 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용한다.
- 자식과 부모 프로세스간 통신의 경우에 사용할 수 있으며, 익명 파이프는 전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용한다.
- 익명 파이프는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문이다. 익명 파이프의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성된다.
- 익명 파이프도 PIPE의 또 다른 단점인 읽기/쓰기가 동시에 가능하지 않으며, read-only, write-only만 가능하다. 하지만 통신선로가 파일로 존재하므로 하나를 읽기 전용으로 열고 다른 하나를 쓰기전용으로 열어서 이러한 read/write문제를 해결 할 수 있다. 호스트 영역의 서버 클라이언트 간에 전이중 통신을 위해서는 결국 PIPE와 같이 두개의 FIFO파일이 필요하게 된다.
- Message Queue
- Queue(큐)는 선입선출의 자료구조를 가지는 통신설비로 커널에서 관리한다. 입출력 방식으로 보자면 위의 Named PIPE와 동일하다고 볼 수 있다. Named PIPE와 다른 점이라면 Name PIPE가 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점이다.
- Shared Memory(공유 메모리)
- 데이터를 공유하는 방법에는 크게 두 가지가 있다. 하나는 통신을 이용해서 데이터를 주고 받는 것이고 다른 하나는 데이터를 아예 공유, 즉 함께 사용하는 것이다.
- PIPE, Named PIPE, Message Queue가 통신을 이용한 설비라면,
Shared Memory는 공유메모리가 데이터 자체를 공유하도록 지원하는 설비이다.- 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다.
이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있다.- 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동할 수 있다.
- Memory Map
- Memory Map도 Shared Memory(공유메모리)공간과 마찬가지로 메모리를 공유한다는 측면에 있어서는 서로 비슷한 측면이 있다.
- 차이점은 Memory Map의 경우 열린파일을 메모리에 맵핑시켜서, 공유한다는 점이다. 파일은 시스템의 전역적인(모두 공유할 수 있는) 자원이므로 서로 다른 프로세스들끼리 데이터를 공유하는데 문제 없다.
- Socket
- 프로세스와 시스템의 기초적인 부분이며, 프로세스 들 사이의 통신을 가능하게 한다.
- 소켓을 사용하기 위해서는 생성해주고, 이름을 지정해주어야 한다. 또한 domain과 type, Protocol을 지정해 주어야 한다. 서버 단에서는 bind, listen, accept를 해주어 소켓 연결을 위한 준비를 해주어야 하고 , 클라이언트 단에서는 connect를 통해 서버에 요청하며, 연결이 수립된 이후에는 Socket을 send함으로써 데이터를 주고 받게 된다. 연결이 끝난 후에는 반드시 Socket 을 close()해주어야 한다.
- Semaphore
- Named PIPE, PIPE, Message Queue와 같은 다른 IPC설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는데 반해, Semaphore는 프로세스 간 데이터를 동기화 하고 보호하는데 그 목적을 두게 된다.
- 운영 체계 또는 프로그램 작성 내에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호이다.
🙇 참고 사이트 🙇
https://yaelimeee.tistory.com/56 https://jwprogramming.tistory.com/54 https://velog.io/@yanghl98/OS%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-IPC%EB%9E%80