IPC(Inter Process Communication)

이창준·2023년 5월 2일
0
post-thumbnail

IPC :

프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로라고 할 수 있다


※ IPC 통신은 어떤 상황에서 사용을 할까 ?

프로세스는 독립적으로 실행된다. 즉, 독립 되어있다는 것은 다른 프로세스에게 영향을 받지 않는다고 말할 수 있다. (스레드는 프로세스 안에서 자원을 공유하므로 영향을 받는다) 이런 독립적 구조를 가진 프로세스 간의 통신을 해야 하는 상황이 있을 것이다. 이를 가능하도록 해주는 것이 바로 IPC 통신이다.




▣ IPC


  • 위 그림처럼 Process는 완전히 독립된 실행객체이기 때문에 독립되어 있는 만큼 별도의 설비가 없이는 서로간에 통신이 어렵다는 문제가 있다.
  • 이를 위해서 커널 영역에서 IPC라는 내부 프로세스간 통신을 제공하게 되고, 프로세스는 커널이 제공하는 IPC설비를 이용해서 프로세스간 통신할 수 있다.
  • IPC에는 System V IPC와 POSIX IPC 라는 두가지 표준이 존재
    1) System V IPC
    - 오랜 역사를 가진 만큼 이기종간 코드 호환성을 확실히 보장
    - API가 오래되었으며, 함수명도 명확하지않음.
    2) POSIX IPC
    - 직관적으로 API가 구성되어 있어서 상대적으로 조금 더 사용하기 쉬움.
  • 현실에서도 필요에 따라 다양한 통신 설비들이 존재하는 것처럼 IPC에도 다양한 설비들이 존재
  • 각각의 필요에 따라서 적당한 통신 설비들이 준비되어야 하는 것과 마찬가지로 내부 프로세스간 통신에도 그 상황에 맞는 IPC 설비를 선택해야 함.
  • 잘못된 IPC 설비의 선택은 코딩과정을 어렵게 만들거나 프로그램의 작동을 효율적이지 못하게 만들 수 있기 때문에 상황에 맞는 IPC의 선택은, 특히 fork()를 이용해서 만들어진 멀티 프로세스의 프로그램에 있어서 매우 중요


▣ IPC 설비 종류


1. PIPE

  • 파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 가능
  • 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 함.
  • PIPE와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하므로 만약 읽기와 쓰기, 즉 송/수신을 모두 하기 원한다면 두개의 파이프를 만들어야만 가능
  • PIPE는 매우 간단하게 사용할 수 있다는 장점이 있다.
  • 단점은 반이중 통신이라는 점으로 만약 프로세스가 읽기와 쓰기 통신 모두를 해야 한다면 PIPE를 두개 만들어야 하는데, 구현이 꽤나 복잡

2. Named PIPE(FIFO)

  • Named PIPE는 전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용
  • Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능 => 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문
  • 단점으로는, Named PIPE도 읽기/쓰기가 동시에 가능하지 않으며, read-only, write-only만 가능

3. Message Queue

  • Queue(큐)는 선입선출의 자료구조를 가지는 통신설비로 커널에서 관리
  • 입출력 방식으로 보자면 위의 Named PIPE와 동일
  • 메시지 큐는 메모리 공간 => 파이프가 아닌, 어디에서나 물건을 꺼낼 수 있는 컨테이너 벨트라고 볼 수 있다.
  • 컨테이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이, 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음.

4. Shared Memory(공유 메모리)

  • 데이터를 공유하는 방법에는 크게 두 가지
    1) 통신을 이용해서 데이터를 주고 받는 것
    2) 데이터를 아예 공유, 즉 함께 사용하는 것
  • PIPE, Named PIPE, Message Queue가 통신을 이용한 설비라면, Shared Memory는 공유메모리가 데이터 자체를 공유하도록 지원하는 설비
  • Shared Memory(공유 메모리)는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용
  • 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줌.
  • 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동함.

5. Socket(소켓)

  • Socket은 프로세스와 시스템의 기초적인 부분이며, 프로세스 들 사이의 통신을 가능하게 함.
  • sys/socket.h>라는 헤더를 이용하여 사용할 수 있으며, 같은 도메인에서의 경우에서 연결 될 수 있음.
  • 소켓을 사용하기 위해서는 생성해주고, 이름을 지정해주어야 합니다. 또한 domain과 type, Protocol을 지정해 주어야 함.
  • 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.

6. Semaphore

  • 다른 IPC설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는데 반해, Semaphore는 프로세스 간 데이터를 동기화 하고 보호하는데 그 목적을 둠.

  • 프로세스간 메시지 전송을 하거나, 혹은 Shared Memory를 통해서 특정 데이타를 공유하게 될 경우 발생하는 문제가 공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 단지 한번에 하나의 프로세스만 접근 가능하도록 만들어줘야 할 것이며, 이 때 사용되는 것이 Semaphore

profile
안녕하세요^^

4개의 댓글

comment-user-thumbnail
2023년 5월 4일

여러 프로세스가 자원을 공유하는 구조의 IPC들은 동시성처리가 중요하겠군요. 잘 봤습니다.

답글 달기
comment-user-thumbnail
2023년 5월 4일

IPC 통신을 사용하는 상황부터 설명과 종류까지 매끄럽게 이어져서 가독성이 좋았고, 자세한 설명 덕분에 IPC에 대해 잘 알고가는것같습니다 👍

답글 달기
comment-user-thumbnail
2023년 5월 4일

IPC가 이렇게 많은 종류가 있는 걸 처음 알았고 깔끔한 글 덕분에 이해하는데 좋았습니다!

답글 달기
comment-user-thumbnail
2023년 5월 4일

IPC 통신에 대해서 아는게 거의 없었는데 종류별로 깔끔하게 정리해주셔서 좋았습니다.

답글 달기