Skip to main content

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로도 분류되는 이유는, 다중 프로세스 및 스레드를 동기화 하면서 동시에 데이터의 공유 및 전달 역할도 하기 때문이다.

세마포어는 다음과 같은 방식으로 프로세스 동기화를 제어한다.

  1. wait() 혹은 P()(Proberen, 시도하다) 연산
  • 프로세스 혹은 스레드가 자원에 접근하려 할 때, 세마포어의 값을 감소시키는 연산을 수행한다.
  • 세마포어의 값이 0보다 클 경우 이를 수행하며, 만약 0일 경우, 프로세스를 차단하고 0보다 커질 때까지 대기 상태로 만든다.
  1. signal() 혹은 V()(Verhogen, 증가시키다) 연산
  • 프로세스 혹은 스레드가 더 이상 자원을 사용하지 않을 때, 세마포어의 값을 증가시키는 연산을 수행한다. 이로써 대기중이던 프로세스가 해당 자원에 접근할 수 있게 된다.

System Call을 통해 현재 활성화 된 Semaphores를 다음과 같이 확인할 수 있다.

$ ipcs -as

Shared Memory

두 가지 이상의 프로세스에서 같은 메모리 공간에 접근해, 데이터 자체를 공유할 수 있는 방식이다. 해당 방식은 프로세스 간 데이터를 복사할 필요가 없기 때문에 속도가 가장 빠르다. 하지만 동시에 읽고 쓸 수 있기 때문에 메모리의 내용이 부정확하다는 단점이 있다.

System Call을 통해 현재 활성화 된 Shared Memory를 다음과 같이 확인할 수 있다.

$ ipcs -am

Sockets

네트워크를 통해 IPC를 제공하는 방식이다. 해당 방식은 서로 다른 두 기기에서 실행되는 프로세스 간의 양방향 통신을 허용한다.


RPCs(Remote Procedure Calls)

클라이언트 프로세스가 서버 프로세스프로시저를 실행하라는 요청을 보내면, 서버는 프로시저를 실행하고 그 결과를 클라이언트에 보내는 방식이다.

Related Links