[CS] IPC(Inter Process Communication)
IPC란?
- 프로세스는 각자 독립된 메모리 공간을 가지고 있어 서로간의 데이터를 공유할 방법이 없습니다.
- 그렇기 때문에 나온 방식이 IPC로 프로세스 간 통신을 하는 방법입니다.
- 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스간 통신을 할 수 있게 되며, IPC 통신 방법에는 여러 가지가 있습니다.
여러가지 통신 방법
PIPE (익명 PIPE)
- 익명 PIPE는 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있습니다. 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 합니다. 이것은 PIPE를 두개 사용해 해결할 수 있지만 구현이 매우 복잡해질수 있습니다.
- 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용합니다.
- 구현이 매우 간단하다는 장점이 있습니다.
Named PIPE(FIFO)
- 익명 PIPE와 다르게 Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능합니다.
- 통신을 위해 이름이 있는 파일을 사용합니다.
- 익명 PIPE와 같이 단방향 통신만 가능하지만 이름이 있는 파일 두개를 사용해 이를 해결할 수 있습니다.
메시지 큐(Message Queue)
- Named PIPE와 입출력 방식은 동일하지만, Named PIPE는 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 차이가 있습니다.
- 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있습니다. 즉, 다수의 프로세스들이 큐에 메시지를 보낼 수 있고 다수의 프로세스들이 큐로부터 메시지를 꺼낼 수 있습니다.
공유 메모리
- 공유 메모리는 앞서 말한 커널에서 제공하는 통신 설비가 아닌, 데이터 자체를 공유하도록 지원하는 설비입니다.
- 별다른 통신 없이 직접적으로 데이터에 접근하기 때문에 IPC 중 가장 속도가 빠릅니다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해주며 이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있습니다.
세마포어(Semaphore)
- Semaphore는 Named PIPE, PIPE, Message Queue와 같은 다른 IPC설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는데 반해, Semaphore는 프로세스 간 데이터를 동기화 하고 보호하는데 그 목적을 두게 됩니다.
동기화란? 공유 데이터에 동시에 접근하여 값을 변경시키면 문제가 발생할 수 있는데 이것을 막는 방법입니다.
- 공유 메모리에서 Critical Section을 여러개의 프로세스가 동시에 접근하면 안되기 때문에 세마포어를 이용해 이를 해결합니다.
Critical Section이란? 둘 이상의 스레드 혹은 프로세스가 동시에 접근해 연산을 실행하면 안되는 공유 변수가 존재합니다. 이렇게 문제의 원인이 되는 코드 블록을 가리켜 임계영역이라고 합니다.
ref.