IPC
IPC(Inter Process Communication)란, 두 가지 이상의 서로 다른 프로세스 혹은 프로그램 간 통신을 위한 방식이다.
독립된 실행 객체인 프로세스는 커널 영역의 IPC를 통해 프로세스 간 통신을 할 수 있다.
IPC 방식들
Pipes
부모와 자식 프로세스 간 통신을 위한 방식이다. 자식 프로세스는 부모 프로세스로부터 열린 파일 디스크립터를 상속 받고, 서로 읽고 쓸 수 있도록 한다. 이때, 연결된 두 프로세스에서, 하나의 프로세스가 쓰기를 수행한다면, 다른 프로세스는 읽기만 수행할 수 있기 때문에, 서로 읽고 쓰기 위해서는 2개의 Pipes를 만들어야 한다.
Named Pipes(FIFOs)
Pipes와 유사하게 동작하지만, 부모-자식 관계가 필요하지 않다. 같은 시스템 내 어떠한 두 가지 프로세스든 상호간 통신할 수 있는 방식이다. Pipes와 마찬가지로, 서로 읽고 쓰기 위해서는 2개의 Pipes를 만들어야 한다.
Message Queues
하나 이상의 프로세스에서 메시지를 작성해, 이를 큐에 넣으면, 읽기 프로세스가 메시지가 작성된 순서 혹은 우선순위대로 읽을 수 있다. Pipes가 데이터의 흐름이었다면, Message Queues는 데이터가 저장된 메모리 공간이다.
System Call을 통해 현재 활성화 된 Message Queues를 다음과 같이 확인할 수 있다.
$ ipcs -aq
Semaphores
세마포어는 동시성 문제를 해결하기 위해, 프로세스를 동기화 할 때 사용되는 방식이다. IPC로도 분류되는 이유는, 다중 프로세스 및 스레드를 동기화 하면서 동시에 데이터의 공유 및 전달 역할도 하기 때문이다.
세마포어는 다음과 같은 방식으로 프로세스 동기화를 제어한다.
wait()
혹은P()
(Proberen, 시도하다) 연산
- 프로세스 혹은 스레드가 자원에 접근하려 할 때, 세마포어의 값을 감소시키는 연산을 수행한다.
- 세마포어의 값이 0보다 클 경우 이를 수행하며, 만약 0일 경우, 프로세스를 차단하고 0보다 커질 때까지 대기 상태로 만든다.
signal()
혹은V()
(Verhogen, 증가시키다) 연산
System Call을 통해 현재 활성화 된 Semaphores를 다음과 같이 확인할 수 있다.
$ ipcs -as
Shared Memory
두 가지 이상의 프로세스에서 같은 메모리 공간에 접근해, 데이터 자체를 공유할 수 있는 방식이다. 해당 방식은 프로세스 간 데이터를 복사할 필요가 없기 때문에 속도가 가장 빠르다. 하지만 동시에 읽고 쓸 수 있기 때문에 메모리의 내용이 부정확하다는 단점이 있다.
System Call을 통해 현재 활성화 된 Shared Memory를 다음과 같이 확인할 수 있다.
$ ipcs -am
Sockets
네트워크를 통해 IPC를 제공하는 방식이다. 해당 방식은 서로 다른 두 기기에서 실행되는 프로세스 간의 양방향 통신을 허용한다.
RPCs(Remote Procedure Calls)
클라이언트 프로세스가 서버 프로세스에 프로시저를 실행하라는 요청을 보내면, 서버는 프로시저를 실행하고 그 결과를 클라이언트에 보내는 방식이다.