프로세스 간 통신(IPC, Inter-Process Communication)
개념
IPC는 프로세스들 간에 의사소통하는 것을 말한다.
프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻이다.
따라서 컴퓨터 내부에서 보다 효율적으로 정보를 주고받기 위한 통신의 일종이라고 생각하면 되고, 인터넷 통신을 IPC의 확장으로 이해할 수 있다. (프로세스 간 통신이 서버-클라이언트 간 통신과 유시 하기 때문이다.)
종류
1. 공유 메모리(Shared Memory)
- 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비, 프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스 메모리에 할당한다. 이후 어떠 프로세스 건 해당 메모리 영역에 접근할 수 있다.
- 공유 메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동된다.
- 프로세스 간 Read, Write를 모두 필요로 할 때 사용된다.
- 대량의 정보를 다수 프로세스에게 배포 가능하다.
- 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC에서 가장 빠르게 작동할 수 있다.
2. 파이프(PIPE)
- 단방향 통신, 부모 프로세스에서 자식 프로세스에게 일방적으로 통신하는 기법이다.
fork()
를 통해 자식 프로세스를 만들고 나서 부모의 데이터를 자식에게 보낸다.
파이프는 두 가지로 나뉜다.
- 익명 파이프(Anonymous PIPE) : 일반적으로 파이프라고 하면 익명 파이프를 가리킨다.
- 부모와 자식 프로세스 혹은 같은 부모를 가진 자식 프로세스와 같이 서로 관련 있는 프로세스 간 통신에 사용된다.
- 네임드 파이프(Named PIPE) : 특수 파일을 이용하며, 서로 관련 없는 프로세스 간 통신에 사용된다.
3. 소켓(Socket)
- 같은 도메인 내에서 연결될 수 있고 프로세스들 사이의 통신을 가능하게 한다.
- 범용적인 IPC로 양방향 통신이 가능하며 패킷 단위로 주고받음으로 직관적으로 이해하기 쉬운 코드를 만들 수 있다.
4. 메시지 큐(Message Queue)
- 입출력 방식으로는 익명 PIPE와 동일하지만, 커널에서 관리하며 메모리를 사용한 PIPE이다. 구조체 기반으로 통신을 한다.
- FIFO 구조이며, msgtype에 따라 다른 구조체를 가져올 수 있다.
- 프로세스 간 다양한 통신을 할 때 사용할 수 있다.
5. 메모리 맵(Memory Map)
- 공유 메모리처럼 메모리를 공유해준다.
- 열린 파일을 메모리에 매핑시켜서 공유하는 방식이다. (공유 매개체가 파일+메모리)
- 주로 파일로 대용량 데이터를 공유할 때 사용한다.
- 메모리 맵 파일은 크기를 바꿀 수 없으며 사용하기 이전, 이후에만 크기를 바꿀 수 있다.
정리
IPC 종류 |
PIPE |
Named PIPE |
Message Queue |
Shared Memory |
Memory Map |
Socket |
사용시기 |
부모 자식 간 단방향 통신 시 |
다른 프로세스와 단방향 통신 시 |
다른 프로세스와 단방향 통신 시 |
다른 프로세스와 양방향 통신 시 |
다른 프로세스와 양방향 통신 시 |
다른 시스템간 양방향 통신 시 |
공유 매개체 |
파일 |
파일 |
메모리 |
메모리 |
파일+메모리 |
소켓 |
통신 단위 |
Stream |
Stream |
구조체 |
구조체 |
페이지 |
Stream |
통신 방향 |
단방향 |
단방향 |
단방향 |
양방향 |
양방향 |
양방향 |
통신 가능 범위 |
동일 시스템 |
동일 시스템 |
동일 시스템 |
동일 시스템 |
동일 시스템 |
동일 + 외부시스템 |
참고사이트
- https://dar0m.tistory.com/233
- https://jwprogramming.tistory.com/54
- https://gyoogle.dev/blog/computer-science/operating-system/IPC.html
- https://bluemoon-1st.tistory.com/22