스터디/운영체제

[운영체제] Inter Process Communication

latter2005 2021. 4. 2. 00:03

Inter-Process Communication(IPC)

프로세스 간 통신이란 프로세스가 서로 데이터를 주고받는 방법, 경로 등을 의미합니다. 커널의 디자인에 따라 마이크로 커널, 나노 커널 등 통신이 많이 일어나는 디자인의 경우 IPC 방식이 성능을 크게 좌지우지할 수 있습니다.

 

Shared memory

  • 운영체제의 도움을 받아 일부 영역의 메모리를 여러 프로세스가 동시에 접근할 수 있도록 권한을 받습니다.
  • 프로세스는 공유 메모리를 읽고 쓰면서 프로세스 간 통신을 하게 됩니다.
  • 같은 메모리를 사용하는 환경에서 작동하므로 메모리에 접근하여 값을 변경하면 그 즉시 변경된 값이 반영되어 다른 프로세스들이 접근 시 변경된 값을 얻을 수 있습니다.
  • 처음 메모리에 여러 프로세스가 접근 권한을 부여하는 작업에서만 커널 작업이 필요하고 이후엔 커널 동작이 필요 없습니다.

 

동작 과정

  1. 공유 메모리를 사용할 프로세스들 중 하나의 프로세스가 자신이 부여받은 메모리 영역 중 일부분을 선택합니다.
  2. 다른 프로세스 들은 공유할 메모리의 주소를 받아 이를 자신의 메모리 영역에 붙입니다.
  3. 운영체제가 해당 프로세스들 간의 메모리 접근 제한을 풀어줍니다.
  4. 이후 프로세스들은 공유 메모리를 통해 통신하게 됩니다. 

* 운영체제는 더 이상 관여할 필요 없으며 프로세스가 종료 시 메모리를 반환하면 공유 메모리 또한 같이 반환하게 됩니다.

 

공유 메모리 방식은 생산자-소비자 모델과 유사합니다. 하나의 프로세스가 전송할 내용, 명령 등을 공유 메모리에 담아두고 이를 다른 프로세스들이 받아서 작업하는 구조를 가집니다.

 

공유 메모리에는 2가지 메모리 버퍼 형태가 있습니다.

  • Unbounded buffer : 메모리 버퍼의 크기에 제한이 없으며 소비자 프로세스는 새 자원이 만들어질 때까지 기다려야 하며 생산자 프로세스는 항상 새로운 자원을 만들 수 있습니다. 이때 생산자 역할의 프로세스는 공유한 메모리 자원의 크기를 지정하여 이를 함께 소비자 프로세스에 알려주어야 합니다. 
  • Bounded buffer : 메모리 버퍼 크기에 제한이 있으며 소비자 프로세스는 버퍼가 빈 상황이면 새로운 자원이 채워질 때까지 기다리며 생산자 프로세스는 버퍼가 꽉 차 있으면 공간이 남을 때까지 기다려야 합니다.\

코드 예시

왼 : 생산자 프로세스, 오 : 소비자 프로세스

 

Message passing

  • 데이터가 하나의 메시지가 되어 프로세스 간 통신을 하게 됩니다.
  • 충돌 위험이 없기 때문에 소량의 데이터 전송에 유리합니다.
  • 명령만을 주고받는 분산 시스템, 마이크로/나노 커널 방식에 유리합니다.
  • 공유 메모리 방식과 다르게 같은 환경에 있지 않아도 인터넷을 통해서 메시지를 주고받을 수 있습니다. (소켓)
  • 생산자-소비자 모델의 공유 메모리 방식을 이용하면 동기화 작업이 필요 없지만 메시지 전달 방식은 동기화 작업이 필요한 경우가 많습니다. 비동기, 동기 방식에 따라 결정합니다.

 

Send, Receive 2가지 명령에 의해 동작합니다.

  • Direct communication : send, receive 동작이 특정 프로세스를 지정하며 메시지를 직접 주고받습니다.
  • Indirect communication : 프로세스들 가운데 하나의 시스템, 네트워크 등을 두고 메시지를 중재하며 동작합니다. 직접 전달 방식보다 더 유연하게 동작할 수 있으며 중재 시스템의 구현에 따라 보안성, 성능 등 다양한 처리가 가능해집니다.

 

메시지 전달 방식은 동기화 작업이 필요합니다. 동기방식과 비동기 방식이 있습니다.

동기(Blocking, Synchronous)

  • 동기 Send : 메시지를 보내고 나면 받는 프로세스에게 메시지가 도착할 때까지 다른 작업을 할 수 없습니다. 
  • 동기 Receive : 메시지를 받기 전까지 해당 프로세스는 다른 작업을 하지 않고 멈춰 있어야 합니다.

비동기(Nonblocking, Asynchronous)

  • 비동기 Send : 메시지를 보내고 프로세스는 멈추지 않고 다음 작업을 진행합니다.
  • 비동기 Receive : 메시지를 받으면 해당 메시지가 유효한 내용인지 검사를 하고 처리를 합니다.

 

Socket

  • Client-Server 구조에서 통신을 위한 End-Point의 의미입니다.
  • 연결 특성에 따라 1:1, 1:N, N:M 프로세스들이 짝이 되며 각 프로세스들은 Socket이라는 end point를 가지고 socket에 도달한 메시지를 읽어드리는 메시지 전달 방식 인터페이스입니다.
  • IP 주소와 port 번호를 통해 소켓을 구분합니다. 이를 통해 같은 컴퓨터 내의 프로세스에게 전달도 가능하며 네트워크를 이용해 다른 환경의 프로세스에 전달 또한 가능합니다.
  • 네트워크 망을 통해 작성한 메시지를 IP 주소와 port 번호를 통해 경로를 찾고 전달하게 됩니다.

* 소켓은 IPC 방식이 아닌 IPC를 구현하기 위한 하나의 인터페이스이며 설계에 따라 동기, 비동기 방식 모두 가능합니다.

 

Pipe

  • 가장 오래된 UNIX 계열 시스템의 IPC 방식이며 모든 UNIX 계열 시스템이 제공합니다.
  • 두 개의 프로세스가 파일 디스크립터(FD)를 통해 메시지를 주고받는 방식입니다.
  • 기본 파이프 통신은 반이중 방식이며 부모, 자식 관계의 프로세스들만 사용이 가능하다는 한계점이 있습니다.

부모 프로세스가 파이프를 생성하고 fork()를 통해 자식 프로세스를 만든 후 자식 프로세스가 부모 프로세스의 파이프를 통해 통신하게 됩니다.

 

* 별개의 프로세스 간 통신을 위해 Named Pipe(FIFO)가 있으며 다수의 프로세스가 이를 공유하여 통신이 가능합니다. 하지만 기존 파이프와 같이 같은 컴퓨터 환경에서만 동작이 가능합니다.

반응형