프로세스 간 통신 (Inter-Process Communication, IPC)
- 프로세스는 완전히 독립된 실행객체로써, 다른 프로세스의 영향을 받지 않음
- 독립되어 있는 만큼 별도의 설비 없이 서로 간의 통신이 어려움
- 따라서, 커널에서 IPC 라는 내부 프로세스 간 통신 제공 → 프로세스는 커널이 제공하는 IPC 설비를 이용하여 프로세스 간 통신 가능
- IPC: 프로세스들 간의 의사소통을 뜻함
- 프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고 받을 수 있다는 것, 또한 프로세스들이 공유하는 메모리가 필요하다는 뜻
공유메모리
- 공유메모리가 각 프로세스에게 첨부하는 방식으로 작동
- 각 프로세스가 메모리 영역에 첨부 됨
- 대량의 정보를 다수의 프로세스에게 배포 가능
- 중개자 없이 곧바로 메모리에 접근 가능해서 모든 IPC 중 가장 빠르게 작동할 수 있음
IPC 설비 종류
- 상황에 맞는 IPC의 선택은 fork()를 이용해서 만들어진 멀티 프로세스의 프로그램에 있어서 중요함
PIPE
- 익명의 PIPE를 통해서 동일한 부모 프로세스를 가진 프로세스들 간에 단방향 통신 지원
- FIFO 구조, 생성된 PIPE에 대하여 Write 또는 Read 만 가능하게 됨
- 부모-자식 프로세스 간 통신할 때 사용
- 쌍방 통신을 위해서는 Write용 PIPE 1개, Read용 PIPE 1개를 따로 만들어야 함
// read()와 write()가 기본적으로 block 모드로 작동하므로, 프로세스가 read 대기중이라면 read가 끝나기 전에는 write를 할 수 없음
Named PIPE
- 이름을 가진 PIPE를 통해서 프로세스들 간의 단방향 통신 지원, 서로 다른 프로세스들이 PIPE 이름만 알면 통신 가능
- 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데, 그 이유는 프로세스 토인을 위해 이름이 있는 파일을 사용하기 때문
- Named PIPE의 생성은 mkfifo 를 통해 이뤄지는데, mkfifo 가 성공하면 명명된 파일 생성 됨
Message Queue
- 어디에서나 물건을 꺼낼 수 있는 컨베이너 벨트와 유사
- 컨베이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이, 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음
- 커널에서 제공하는 Message queue 이므로 EnQueue 하는데 제한이 존재
Shared Memory
- 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비
- 공유메모리는 중개자 없이 곧바로 메모리에 접근할 수 있으므로 다른 모든 IPC 중에서 가장 빠르게 작동할 수 있음
- 프로세스 간의 Read, Write를 모두 필요로 할 때 사용함
Memory Map
- 프로세스의 가상 메모리 주소 공간에 파일을 매핑한 뒤, 가상 메모리 주소에 직접 접근하여 파일 읽기/쓰기를 대신 함
- 운영체제에서 페이징 기법을 사용하여 파일의 내용을 관리하며 페이지 크기에 따라 적절히 파일의 내용을 읽고 쓸 수 있음
Socket
- 같은 도매인 내에서 연결될 수 있고 프로세스들 사이의 통신을 가능하게 함
- 서버단에서 bind, listen, accept를 진행해 소켓 연결을 위한 준비를 함
- 클라이언트 단에서 connect를 통해 서버에 요청하고 연결이 수립된 후에는 socket에 send 하여 데이터를 주고 받음
- 연결이 끝난 후에는 반드시 Socket을 close() 해야 함
- 범용적인 IPC로써 양방향 통신이 가능하며, 패킷 단위로 주고 받아서 직관적으로 이해하기 쉬운 코드 생성 가능
요약
IPC 종류 | PIPE | Named PIPE | Message Queue | Shared Memory | Memory Map | Socket |
용도 | 부모 자식 간 단방향 통신 | 다른 프로세스와 단방향 통신 | 다른 프로세스와 단방향 통신 | 다른 프로세스와 양방향 통신 | 다른 프로세스와 양방향 통신 | 다른 시스템 간 양방향 통신 |
공유 매개체 | 파일 | 파일 | 메모리 | 메모리 | 파일 + 메모리 | 소켓 |
통신 단위 | stream | stream | 구조체 | 구조체 | 페이지 | stream |
통신 방향 | 단방향 | 단방향 | 단방향 | 양방향 | 양방향 | 양방향 |
참고
1. https://mesajang.tistory.com/157?category=950485
2. https://heeonii.tistory.com/13
'Backend Loadmap > Operating System' 카테고리의 다른 글
[백엔드로드맵][OS] POSIX 기초 (0) | 2023.05.20 |
---|---|
[백엔드로드맵][OS] 입출력 (I/O) 관리 (1) | 2023.05.12 |
[백엔드로드맵][OS] 메모리 관리 (0) | 2023.04.24 |
[백엔드로드맵][OS] 기본적인 터미널 명령어 (0) | 2023.04.07 |
[백엔드로드맵][OS] 스레드와 동시성 (0) | 2023.04.06 |