IPC
IPC(Inter Process Communication)는 프로세스 간의 통신을 일컫는 말입니다.
프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고받을 수 있다는 것입니다.
즉, 이는 동시에 접근 가능한 메모리, 다른 말로는 서로 공유하는 메모리가 있다는 것을 뜻합니다.
IPC의 종류
1. 익명 파이프 (Anonymous PIPE)
익명 파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있기 때문에 한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부릅니다.
따라서, 양쪽으로 모두 송/수신을 하고 싶으면 2개의 파이프를 만들어야 합니다.
간단하게 사용할 수 있는 장점이 있고 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적입니다.
단점으로는 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해지게 됩니다.
2. 네임드 파이프 (Named PIPE)
익명 파이프는 통신할 프로세스를 명확히 알 수 있는 경우에 사용합니다. (ex. 부모-자식 프로세스 간 통신)
네임드 파이프는 전혀 모르는 상태의 프로세스 간 통신에 사용합니다.
즉, 네임드 파이프는 익명 파이프의 확장된 상태로서 부모 프로세스와 무관한 다른 프로세스도 통신이 가능하고 통신을 위해 이름 있는 파일을 사용합니다.
하지만 익명 파이프처럼 읽기/쓰기가 동시에 불가능하므로 전이중 통신을 위해서는 2개를 만들어야 합니다.
3. 메시지 큐 (Message Queue)
입출력 방식은 네임드 파이프와 동일합니다.
하지만 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간입니다.
메시지 큐는 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있습니다.
또한, 메시지의 접근을 위해서는 키가 필요합니다.
4. 공유 메모리
파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비입니다.
공유 메모리는 프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용해줍니다.
프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 됩니다.
공유 메모리는 프로세스 간 읽기/쓰기가 모두 필요로 할 때 사용합니다.
또한, 중개자 없이 곧바로 메모리에 접근할 수 있어서 IPC 중에 가장 빠르게 작동합니다.
5. 메모리 맵
메모리 맵은 공유 메모리처럼 메모리를 공유해줍니다.
메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식입니다. (즉, 공유 매개체 = 파일+메모리)
주로 파일로 대용량 데이터를 공유해야 할 때 사용합니다.
6. 소켓
소켓은 네트워크 소켓 통신을 통해 데이터를 공유합니다.
클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용합니다.
소켓은 전이중 통신이 가능하고 서버/클라이언트 환경을 구축하는데 용이합니다.
- 서버 : bind(), listen(), accept()
- 클라이언트: connect()
IPC 종류 | 익명 파이프 | 네임드 파이프 | 메시지 큐 | 공유 메모리 | 메모리 맵 | 소켓 |
사용 시기 | 부모-자식 간 단 방향 통신 | 다른 프로세스와 단 방향 통신 | 다른 프로세스와 단 방향 통신 | 다른 프로세스와 양 방향 통신 | 다른 프로세스와 양 방향 통신 | 다른 시스템과 양 방향 통신 |
공유 매개체 | 파일 | 파일 | 메모리 | 메모리 | 파일+메모리 | 소켓 |
통신 단위 | Stream | Stream | 구조체 | 구조체 | 페이지 | Stream |
통신 방향 | 단 방향 | 단 방향 | 단 방향 | 양 방향 | 양 방향 | 양 방향 |
통신 가능 범위 | 동일 시스템 | 동일 시스템 | 동일 시스템 | 동일 시스템 | 동일 시스템 | 동일 + 외부 시스템 |
프로세스 동기화
공유된 자원에 여러 프로세스가 동시에 접근하면 문제가 발생할 수 있습니다.
이때, 공유된 자원의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두어야 합니다.
따라서, IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용합니다.
'CS 지식 > 운영체제' 카테고리의 다른 글
[CS] 교착 상태 (0) | 2023.08.26 |
---|---|
[CS] 상호 배제 (0) | 2023.08.26 |
[CS] 인터럽트 (0) | 2023.08.23 |
[CS] 프로세스와 스레드 (0) | 2023.08.16 |
[CS] 운영체제 (0) | 2023.08.14 |