본문 바로가기
📌CS/OS

[OS] 프로세스 간 통신 방법(Inter Process Communication, IPC)

by dar0m! 2021. 5. 2.

개념

리눅스 커널 구조 (출처 : https://jwprogramming.tistory.com/54)

프로세스들 간의 의사소통하는 것을 IPC라고 한다. 프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고 받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻이다.

따라서 컴퓨터 내부에서 보다 효율적으로 정보를 주고 받기 위한 통신의 일종이라고 생각하면 되고, 인터넷 통신을 IPC의 확장으로 이해할 수 있다. (프로세스간 통신이 서버-클라이언트 간 통신과 유사하기 때문)

프로세스간 통신을 위해 '파이프'와 같은 개념이 등장하게 되었다.

💡 스레드 간 통신보다 프로세스 간 통신이 어려운 이유

프로세스와 스레드의 차이를 알고 있다면 이해하기 쉽다. 우리는 fork와 같은 함수로 프로세스를 pthread_create와 같은 함수로 쓰레드를 각각 생성해주는데, 이 과정에서 큰 차이가 존재한다.

프로세스는 생성되면서 PC를 포함하여 메모리 공간 등을 복사하여 별도의 자원을 할당하지만, 스레드는 메모리 공간과 자원을 공유하기 때문이다.

따라서 프로세스는 통신할 수 있는 공간이 없기 때문에 통신을 위한 별도의 공간을 만들어주어야 하기 때문에 스레드 간 통신보다 어렵다고 할 수 있다.

이를 위해서 커널 영역에서 IPC라는 내부 프로세스간 통신(Inter Process Communication) 제공하게 되고, 프로세스는 커널이 제공하는 IPC설비를 이용해서 프로세스간 통신   있게 된다.

 

종류

1. 공유 메모리 (Shared Memory)

  • 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비. 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
  • 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다.
    • 공유 메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동하게 된다.
    • = 각 프로세스가 메모리 영역에 첨부됨
  • 프로세스간 Read, Write를 모두 필요로 할때 사용한다.
  • 대량의 정보를 다수의 프로세스에게 배포 가능하다.
  • 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 작동할 수 있다.

2. 파이프 (Pipe)

파이프 (출처 : https://jwprogramming.tistory.com/54)

통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고 받게끔 한다.

  1. 익명 파이프 (Anonymous PIPE)
    • 일반적인 파이프
    • 통신할 프로세스가 명확하게 알 수 있는 경우 사용.
      • 부모-자식 or 형제 프로세스 간 통신에 사용
      • 외부 프로세스에서 사용할 수 없다.
    • 파이프는 두 개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나 데이터를 읽기만 할 수 있다. 한쪽 방향으로만 통신이 가능한 파이프의 특징때문에 반이중(Half-Duplex) 통신이라고 부르기도 한다.
    • 송/수신을 모두 하기 원한다면 두 개의 파이프를 만들어야 가능
    • 간단하게 사용할 수 있다.
    • pipe 함수로 생성
    • 단점
      • 반이중 통신 → 프로세스가 읽기와 쓰기 통신을 모두 해야한다면, PIPE 두 개를 만들어야 하므로 구현이 복잡해질 수 있다.
      • 전이중 통신을 고려해야될 상황이라면 낭비가 심하기 때문에 좋은 선택이 아니다.
  2. 네임드 파이프 (Named PIPE)
    • 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
    • 익명 파이프의 확장된 상태부모 프로세스와 무관한 다른 프로세스도 통신 가능
      • 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능하다.
      • FIFO 라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용한다.
      • = 외부 프로세스와 통신 가능
    • mkfifo or mknod 함수로 생성
    • 단점
      • 반이중 통신 → 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능하다.

3. 소켓 (Socket)

소켓

  • Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영 체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드 포인트이다.
  • 네트워크 소켓 통신을 통해 데이터를 공유한다.
    • 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받는 방식이다.
    • 이 때 각각 PC의 PORT를 담당하는 소켓은 각각 하나의 프로세스이다.
    • 즉 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역할을 진행하는 프로세스인 것 입니다.
    • 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1 대 1로 데이터를 주고받는 방식이다.
  • 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
  • 전이중(Full Duplex, 양방향) 통신이 가능하다.
  • 서버/클라이언트 환경을 구축하는데 용이하다.
  • 서버(bind, listen, accept), 클라이언트(connect)
  • 중대형 애플리케이션에서 주로 사용한다.

4. 메시지 큐(Message Queue)

메시지 큐

  • 입출력 방식은 Named 파이프와 동일하다.
  • 다른점
    • 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다. (메모리를 사용한 PIPE)
    • PIPE나 FIFO와는 달리, 다수의 프로세스간 메시지를 전달 할 수 있음
  • 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
  • 메시지의 접근을 위해서는 키(key)가 필요하다.

5. 메모리 맵(Memory Map)

메모리 맵(출처 : https://doitnow-man.tistory.com/110)

  • 공유 메모리처럼 메모리를 공유해준다.
  • 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다. (즉 공유 매개체가 파일+메모리)
  • 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
  • FILE IO 가 느릴 때 사용하면 좋다.
  • 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맵 파일을 이용한다.
  • 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.

6. RPC(Remote Procedure Call)

  • RPC 방법은 분산 네트워크 망에서 많이 사용되는 방식이다.
  • 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술이다. 다시 말해, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 동일한 코드를 이용할 수 있다.
  • 해당 방법은 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것처럼 데이터를 가져와 사용하는 통신방법이다.
    • 스텁(stub)을 통해서 마치 자신의 디스크에 존재하는 것 처럼 착각을 일으켜 사용하는 방식이다.
    • 스텁 : 리눅스에서 공유 라이브러리의 일부분 중 하나
    • 프로시저 : 루틴, 서브루틴, 함수와 같은 뜻으로 사용되며 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부이다. 또는 어떤 행동을 수행하기 위한 일련의 작업 순서를 말한다.

 

이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)

세마포어(Semaphore)

  • 위의 다른 IPC 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는 것에 반해, 세마포어는 프로세스간 데이터를 동기화하고 보호하는데 목적을 둔다.
  • 공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 한번에 하나의 프로세스만 접근 가능하도록 할 때 사용된다.

정리

IPC 종류  PIPE Named PIPE  Mesage Queue  Shared Memory  Memory Map  Socket 
사용
시기
 부모 자식 간
단 방향 통신 시
다른 프로세스와 
단 방향 통신 시 
다른 프로세스와
 단 방향 통신 시  
다른 프로세스와
양 방향 통신 시 
다른 프로세스와 
양 방향 통신 시 
 다른 시스템간 
양 방향 통신 시
 공유
매개체
파일  파일  메모리  메모리  파일+메모리  소켓 
통신
단위
 Stream Stream 구조체 구조체  페이지 Stream 
 통신
 방향
 단 방향 당 방향  단 방향  양 방향  양 방향  양 방향 
통신 
가능 
범위
 동일 시스템 동일 시스템 동일 시스템  동일 시스템  동일 시스템  동일 + 외부 
시스템 

 

참고

댓글0