[CS] IPC(Inter Process Comunication)란?

giggle·2023년 7월 27일
0

📌 IPC(Inter Process Comunication)란?

프로세스는 완전히 독립된 공간을 가지고 있기 때문에, 다른 프로세스의 영향을 받지 않는다는 장점이 있습니다. 하지만, 서로 독립되어 있으므로 별도의 설비가 없이는 통신이 어렵다는 문제가 있습니다.

이러한 문제를 극복하기 위해 커널 영역에서 IPC(Inter Process Comunication)라는 내부 프로세스간 통신을 제공하게되었습니다. 즉 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스간 통신을 할 수 있습니다.

커널(Kernel)이란?
운영체제 자체도 소프트웨어이기 때문에 메모리에 올라가야 사용할 수 있습니다. 하지만 메모리 공간의 제약으로 운영체제 중 항상 필요한 부분만을 메모리에 올려놓습니다. 이때 메모리에 상주하는 운영체제의 부분을 커널이라고 합니다.
-> 그러므로 커널이란 메모리에 상주하는 부분으로 운영체제의 핵심적인 부분입니다.


📌 IPC 종류

PIPE(파이프)

  • 파이프는 두 개의 프로세스를 연결하고 하나의 프로세스는 데이터를 쓰기만 하고, 다른 프로세스는 데이터를 읽기만 가능
  • 부모 자식 간에 단방향 통신으로 자주 사용
  • 한쪽 방향으로만 통신이 가능한 PIPE의 특징 때문에 Half-Duplex(반이중) 통신 이라고도 불림
  • PIPE는 반이중 통신이기에 하나의 통신선로는 읽기/쓰기 중 하나만 가능하므로 만약 읽기/쓰기, 즉 송/수신을 모두 하기 원한다면 두 개의 파이프를 만들어야 가능

장점

  • PIPE는 간단하게 사용 가능
  • 한쪽 프로세스는 단지 읽기만하고 다른 프로세스는 단지 쓰기만 하는 단순한 데이터 흐름에 적합

단점

  • Full-Duplex(전이중) 통신 방식으로 활용하려면 PIPE를 두 개 만들어야 하는데, 구현이 꽤나 복잡 (굳이 전이중을 활용해야한다면 PIPE말고 다른 방법을 찾는게 효율적)
  • buffer가 상대적으로 작기때문에 overflow 될 높은 확률
  • 부모 자식 관계의 프로세스들 사이에서 가능

Named PIPE

  • Named Pipe는 고유한 이름을 가지고 있으며, 파일 시스템에서 파일처럼 접근, 이러한 이름을 통해 여러 개의 프로세스가 특정 Named Pipe에 접근하여 통신
  • 보통 PIPE는 부모자식간에 사용하고 Named PIPE는 전혀 모르는 상태의 프로세스들 사이에서 통신할 경우 사용
  • Named PIPE는 부모프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데, 이유는 프로세스간에 통신을 위해 이름이 있는 파일을 매개체로 사용하기 때문

장점

  • PIPE는 간단하게 사용 가능
  • 한쪽 프로세스는 단지 읽기만하고 다른 프로세스는 단지 쓰기만 하는 단순한 데이터 흐름에 적합

단점

  • 읽기/쓰기가 동시에 이루어지지 않음, 단방향 통신, read-only or write-only
  • 기본 PIPE와 비슷

Message Queue(메시지 큐)

  • FIFO(First-In First-Out, 선입선출) 자료구조를 가지는 통신설비로 커널에서 관리, 입출력 방식으로보면 위에 Named PIPE와 동일
  • Message Queue는 메모리 공간이라는 점, 어디서나 물건을 꺼낼 수 있는 컨테이너 벨트와 같다 보면 된다
  • Message Queue에 쓸 데이터에 번호를 붙힘으로써 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다

장점

  • 비동기 방식이기에 방대한 처리량이 있다면 큐에 넣은 후 나중에 처리 가능
  • 다수의 프로세스들이 큐에 메시지를 수신, 발신 가능
  • 분산처리 및 경쟁처리 방식에 사용

단점

  • 메시지가 정말 잘 전달되었는지 알 수 없음
  • 메시지와 메시지큐의 크기와 용량을 제대로 고려하지 않는다면 큐에 데이터를 넣고 나오는 과정에서 오버헤드가 발생
  • 데이터가 많이 쌓일수록 추가적인 메모리 자원이 필요

Shared Memory(공유 메모리)

  • 공유메모리가 데이터 자체를 공유하도록 지원하는 설비
  • Shared Memory(공유 메모리)는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용
  • 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해 주게되고, 이후 어떤 프로세스건 해당 메모리영역에 접근

장점

  • 공유 메모리는 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC중에서 가장 빠르게 작동 (다시말해, 커널메모리영역에서 관리하기에 빠르게 접근 가능)
  • 쉬운 데이터 공유: 공유 메모리를 사용하면 별도의 IPC 메커니즘을 구현하지 않아도 되기 때문에, 데이터 공유가 간단
  • 시스템 자원 절약: 데이터 복사나 전송에 따른 오버헤드가 없기 때문에, 시스템 자원을 절약

단점

  • 메시지 전달 방식이 아니기에 데이터를 읽어야하는 시점을 알 수 없다
  • 커널 설정에 종속적이기에 사용하기전에 커널에서 허용하고 있는 공유메모리 사이즈에 따라 성능 편차가 발생
  • 여러 프로세스가 동시에 공유 메모리에 접근할 수 있기 때문에, 데이터의 일관성을 유지하기 위해 동기화가 필요(디버깅 문제, 보안 문제..)

참고


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글