프로세스 간 통신과 동기화 :: YJcode

리눅스 시스템은 수많은 프로세스로 이루어져 있고, 이 중 상당수는 상호 독립적으로 동작한다. 하지만 경우에 따라서 프로세스들은 서로 협력해서 목적을 달성하는 경우도 있는데, 이럴 때 이들은 서로 통신하고 서로의 동작을 동기화할 방법이 필요하다.

 

프로세스 간의 통신방법 중한 가지로 서로 협의가 된 디스크의 특정 파일에 정보를 쓰고, 읽는 것이다. 하지만 이러한 방법은 통신방법으로는 너무 느리고 불편하다. 직접 통신을 할 수 있는데 굳이 CPU나 메모리에 비해 한참 속도가 떨어지는 디스크(혹은 SSD와 같은 저장장치)를 사용하여 통신을 할 필요가 없는 것이다. 그래서 리눅스는 다음과 같은 방법으로 통신을 한다.

 

  • 시그널 : 이벤트가 발생했음을 알리는 통신방법
  • 파이프(pipe - | ), FIFO : 프로세스 간에 데이터를 전송해야 할 때 쓰는 통신방법
  • 소켓 통신 : 컴퓨터 안의 프로세스간에 혹은 다른 PC와 네트워크를 통해 프로세스 간에 데이터를 보낼 때 사용
  • 파일 잠금 : 말 그대로 다른 프로세스가 파일을 열람하거나 수정하지 못하도록 독점하는 행위
  • 메시지 큐 : 프로세스 간에 메시지(데이터 패킷)을 교환할 때 사용
  • 세마포어 : 프로세스간의 동작을 동기화할 때 사용
  • 공유 메모리 : 둘 이상의 프로세스가 메모리 일부를 공유할 경우 사용. 이러한 경우 공유 메모리를 사용하고 있는 프로세스들 중 어느 하나의 프로세스가 메모리 일부를 갱신하면, 다른 프로세스도 즉시 갱신된 메모리를 확인할 수 있다.

 

이러한 통신 방법을 IPC(interprocess communication) 방법이라고도 하며, 중복되는 기능들이 많은 이유는 리눅스를 포함한 많은 유닉스 시스템에는 한 가지 통신방식만 있는 것이 아니라 여러 방식으로 변화된 표준들(변종 계통이 많다)이 있고, 이들이 요구하는 표준이 각기 다르기 때문이다. 예를 들어 FIFO와 유닉스 도메인 소켓은 같은 시스템상의 독립된 프로세스 간에 데이터를 교환한다는 점에서 근본적으로 동일한 기능을 수행하지만, 이들이 어디에서 파생되어서 왔는지를 살펴보면 FIFO는 시스템 V, 소켓은 BSD에서 왔다는 점에서 둘 모두를 수용하는 과정에서 FIFO, 소켓통신 모두를 지원하고 있다고 보면 되겠다.

+ Recent posts