본문 바로가기

CS/운영체제

[IPC] Inter Process Communication

지난 포스팅에서 프로세스, 스레드의 개념, 그리고 멀티 프로세스와 멀티 스레드의 개념에 대해 정리해 보았다. 멀티 프로세싱은 하나의 프로그램을 여러 개의 프로세스로 나누어 각각의 프로세스가 하나의 작업을 병렬적으로 처리하도록 하는 것이다. 하나의 작업을 하는 각각의 프로세스들은 메모리 공간이 독립되어 있어, 한 프로세스에서 문제가 생기더라도 다른 프로세스에 영향을 미치지 않는다. 그러나 데이터를 주고받거나, 서로 통신하기 위한 작업이 필요한데 이를 IPC(Inter Process Communication)이라고 한다. 오늘은 IPC의 종류와 특징에 대해 정리하려고 한다.


Inter Process Communication

프로세스는 독립된 실행 객체로 다른 프로세스에 영향을 받지 않는다. 그렇기에 프로세스 간 통신을 하는데 어려움이 있다. 통신을 하기 위해 커널영역에서는 IPC를 제공한다. 

IPC는 Inter-Process Communication의 약자로, 프로세스 간 통신을 의미한다. 여러 프로세스가 동시에 실행되는 환경에서 데이터를 주고받거나 서로 간에 통신하기 위한 메커니즘이다. 다양한 IPC 기법들이 존재하며, 각각의 기법은 특정한 상황에 적합하며 장단점을 가지고 있다.

 

1. Pipe

프로세스 간 통신을 하기 위해 추가의 메모리 공간(버퍼)을 할당하여 데이터를 주고받을 수 있도록 한다. 단방향 통신으로 하나의 프로세스는 데이터를 쓰기만, 다른 하나의 프로세스는 프로세스를 읽기만 한다. 만약 하나의 프로세스가 읽기/쓰기 작업을 모두 한다면 새로운 파이프를 추가 할당해 2개의 파이프를 사용하여 양방향 통신을 할 수 있다. 하지만 애초에 파이프는 간단한 구현과 사용을 위해 설계되었기 때문에 2개의 파이프로 양방향 통신을 구현하는 것은 효율적이지 못하다.

  • 간단히 사용 가능. 하나의 프로세스는 읽기만, 다른 프로세스는 쓰기만 할 경우 적합.
  • 단방향 통신이기 때문에 파이프로 양방향 통신을 구현하려면 복잡.
  • 독립적인 프로세스 간의 통신에서도 사용하지만, 주로 부모-자식 간 프로세스에서 사용

Anonymous Pipe와 Named Pipe

▷ Anonymous Pipe

부모 프로세스와 자식 프로세스 간의 통신을 위한 파이프로, 이름이 없다. 그렇기 때문에 데이터 통신을 할 프로세스가 명확한 경우에 Anonymous Pipe를 사용한다. PPID(부모 프로세스 ID)를 통해 파이프 접근.

  • pipe 함수를 사용하여 pipe 생성
  • 부모-자식 관계의 프로세스가 통신할 때 사용(부모-자식 관계가 아니라면 통신 불가)
  • 파이프를 위한 메모리 공간(버퍼) 할당
  • 단방향 방식(하나의 파이프는 읽기 또는 쓰기 하나만 가능)

 Named Pipe

프로세스 간 연관관계가 없는, 즉 독립적인 프로세스들 간 통신을 할 때는 Named Pipe를 사용한다. Anonymous Pipe와는 다르게 버퍼를 할당받지 않고, 파일을 통해 통신한다.  파일을 사용할 때는 읽기/쓰기 둘 중 하나만 사용할 수 있으므로 결국 반이중 통신이다. 즉, 다수의 클라이언트를 처리하기에는 비효율적이다.

  • mkfifo 함수를 통해 파이프로 사용할 파일 생성
  • 독립적인 프로세스 간 통신을 위해 사용
  • 반이중 방식(읽기, 쓰기 모두 가능하지만, 한 번에 하나만 가능)

2. Message Queue

메시지 큐는 다중 프로세스 간 통신을 지원하는 방법으로, 큐의 FIFO(First In First Out)의 자료구조를 가진다. Named Pipe와 다르게 메모리 공간에서 통신이 이루어진다. 또한 비동기 통신이 가능하고, 식별자에 의해 데이터들이 식별되어 여러 프로세스가 동시에 원하는 데이터로의 접근이 가능하다. 다만 구현이 복잡하고, 메시지 크기에 제한이 있을 수 있다.

메시지 큐에 대해 자세히 알아보기

 

3. Shared Memory

여러 프로세스가 메모리 영역을 공유하여 데이터를 주고받는 공유 메모리는 중개자 없이 메모리에 접근할 수 있기 때문에 빠른 속도로 데이터를 공유할 수 있는 장점이 있다. 그러나 동기화 문제가 발생할 수 있고, 메모리 관리에 주의해야 한다.

동기화 문제에 대해 알아보기

4. Memory Map [참고]

메모리 매핑은 디스크에 있는 파일의 일부분 또는 전체 파일을 응용 프로그램 주소 공간 내 특정 범위의 주소로 매핑하는 메커니즘이다. Shared Memory와 유사하게 메모리 공간을 공유한다는 공통점이 있지만, 해당 메모리 공간을 파일과 매핑하여 공유한다. Memory Map도 Shared memory처럼 빠른 속도를 자랑하지만, 파일 I/O와 관련하여 낮은 성능을 보여줄 수 있다.

메모리 맵 방식의 경우 파일로 연결하기 때문에 버퍼를 사용하지 않고, Page를 이용하여 데이터 처리가 가능해진다. 버퍼는 커널에서 적은 한정된 메모리 공간을 할당하기에 용량적으로 한계가 있다. 하지만 페이지(4KB의 크기)를 사용함으로써 메모리 낭비 없이 크기와 처리속도가 빨라진다.

5. Socket

소켓은 네트워크를 통해서 프로세스 간 통신을 지원하는 방법이다. 파이프 개념을 네트워크로 확장시킨 것으로 볼 수 있다. 주로 Client-Server 모델이나 Peer-to-Peer 모델에서 사용한다. 동일 시스템 내에서는 UDS(Unix Domain Socket)로 IPC를 지원할 수 있고, 다른 네트워크 상에서는 Network Socket으로 사용한다.

 

Socket의 종류 

TCP와 UDP에 대해 알아보자

TCP (Transmission Control Protocol)

  • 클라이언트와 서버가 연결을 맺고, 안전하게 데이터를 주고받음
  • 클라이언트와 서버는 socket()으로 소켓을 생성하고, connect()와 accept()로 연결을 수립
  • 데이터는 send()와 recv() 함수를 사용하여 스트림으로 주고받음
  • 데이터의 전송이 보장되며, 순서가 보장
  • 데이터를 스트림으로 전송

UDP (User Datagram Protocol)

  • 클라이언트와 서버가 연결을 맺지 않고, 데이터를 주고받음
  • 클라이언트와 서버는 socket()으로 소켓을 생성하고, 바인딩한 후 sendto()와 recvfrom() 함수를 사용하여 데이터를 주고받음
  • 데이터의 순서와 신뢰성 보장 어려움

소켓 통신

  • 클라이언트와 서버가 특정 포트를 통해 양방향 통신을 하는 방식
  • 데이터 전달 후 연결이 끊어지지 않고 계속 연결 유지
  • 클라이언트와 서버가 실시간으로 데이터를 주고받아야 하는 경우
  • 실시간 동영상 스트리밍, 온라인 게임 등에 사용

참고 사이트

 

메모리 맵 - mmap(), munmap(), msync()

* 메모리 맵 - mmap() ; 파일(리눅스에서는 디바이스도 파일로 처리하므로 디바이스도 메모리 맵으로 연결 가능)을 처리하기 위해서는 보통 저수준으로는 파일 디스크립터를 이용하고, 고수준으로

damduc.tistory.com

 

[운영체제] IPC Inter-Process Communication

IPC란? 프로세스는 독립적으로 실행된다. 이처럼 독립적인 공간을 가진 프로세스 간 통신에 사용되는 기법이 IPC 통신이다. 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간의 통신을

yaelimeee.tistory.com

 

'CS > 운영체제' 카테고리의 다른 글

Dead Lock  (0) 2022.08.11
동기화 문제의 해결  (0) 2022.08.11
Multi-Process VS Multi-Thread  (0) 2022.08.03
Thread란  (0) 2022.08.03
Process란  (0) 2022.07.13