본문 바로가기
Computer Science/운영체제

[OS] 프로세스 간의 통신, IPC란? (프로세스 간 통신이 필요한 이유, IPC 기법과 특징)

by 그적 2024. 1. 17.

목차

  • IPC 개념
  • 프로세스 간의 통신이 필요한 이유
  • IPC 방식
  • IPC 종류 : Shared Memory
  • IPC 종류 : Memory Passing
  • IPC 종류 : Socket
  • 정리

 


1. IPC란?

안정성을 위해 운영체제는 본인 프로세스에 할당된 메모리만 접근할 수 있도록 제한한다. 당연하게도 만약 다른 프로세스의 code 및 data 영역에 접근해 실행하거나 수정할 수 있다면, 어떻게 될까? 이는 운영체제 권한의 의미가 사라지고 매우 위험하다. 하지만 프로세스 간의 자원과 데이터가 공유해야 하는 상황이 발생할 수 있다. 독립적인 공간을 갖는 프로세스의 데이터를 공유하기 위해 필요한 별도의 통신 메커니즘이 IPC(InterProcess Communication)인 것이다.

 


2. 프로세스 간의 통신이 필요한 이유

커널 영역의 별도의 통신을 IPC라고 부른다고 했다. 그럼 IPC 통신이 필요한 이유는 무엇일까?

 

1) 정보 공유(Information Sharing)를 위해

프로세스가 생성이 되면 각 프로세스마다 메모리 공간이 할당된다. 이러한 메모리 공간은 다른 프로세스가 접근할 수 없기 때문에, 다른 프로세스의 데이터를 필요로 할 때 IPC 통신을 이용한다.

 

2) 동작 속도 향상(가속화, Computation Speed-Up)을 위해

프로세스가 동작할 때 항상 CPU를 사용하는 것이 아니다. 따라서 프로세스 여러 개의 작업 단위로 쪼갬으로써 프로세스가 병렬적으로 동작할 수 있도록 한다. 

 

3) 모듈성(Modularity)을 위해

시스템 기능을 별도의 프로세스나 스레드로 만들어 모듈로 나눈다. 기능 분리를 통해 모듈 방식으로 컴퓨터를 구성할 수 있도록 했고, 이를 위해 IPC 통신이 필요하다.

 

4) 편의성(Convenience)을 위해

사용자가 여러 작업을 동시에 수행해야 할 수 있도록 하기 위해 IPC 통신이 필요하다.

 

결과적으로 봤을 때, 프로세스 간의 통신을 하는 이유의 핵심은 자원에 대한 공유를 필요로 하기 때문인 것 같다.

 


3. IPC 방식

 

IPC를 하는 방식은 공유 메모리에서 데이터를 공유하도록 지원하는 방식과 프로세스끼리 통신을 하는 방식으로 크게 두 가지로 나뉜다. 대부분의 운영체제는 두 가지 방식을 모두 구현하고 있다.

 

첫째, 공유 메모리(Shared Memory)

프로세스끼리 메모리를 공유해 사용하는 방식으로, 공유 메모리에 대한 읽기/쓰기 작업을 수행하면서 데이터를 공유한다. 중개자(커널) 없이 프로세스가 직접 메모리에 접근해 데이터를 읽기 때문에 속도가 빠르다는 장점을 가진다. 하지만 프로세스 간에 언제 읽고 쓰는지에 대한 관리가 되지 않아 동기화 문제가 발생하므로 이에 대한 처리가 필요하다.

 

둘째, 메시지 전달(Message Passing)

커널을 이용해 메시지를 주고받는 통신 방법이다. 커널 내부에 메시지를 기록할 수 있는 공간을 마련해두고, 시스템 콜을 통해 메시지를 교환함으로써 프로세스 간의 작업 상황을 주고받을 수 있다.

 


4. IPC 종류 : Shared Memory

1) Shared Memory

프로세스가 공유 메모리 할당을 커널에게 요청하면, 커널은 프로세스 간 공유할 수 있는 메모리 영역을 할당해준다. 이후, 모든 프로세스에서 공유 메모리에 대한 읽기/쓰기를 할 수 있다.

 

2) Memory Map

열린 파일을 메모리에 매핑시켜 공유한다. 한번 메모리에 공유된 파일이 올라가면 메모리에 할당된 공간이 바뀌지 않는다. 따라서 메모리 맵 사용 이후에만 파일의 크기를 바꿀 수 있다.

 


4. IPC 종류 : Message Passing

1) PIPE (Anonymous PIPE)

 

두 프로세스를 연결한 파이프를 통해 데이터를 공유한다. 하나의 프로세스는 쓰기만, 하나의 프로세스는 읽기만 가능하기 때문에 반이중 통신으로도 불린다. 기본적으로 block mode로 동작되어 프로세스가 데이터를 사용하고 있다면, 다른 프로세스는 데이터 사용을 기다려야 한다.

  • 읽기/쓰기만 하기 때문에 구현이 단순하다는 장점을 가진다.
  • 두 프로세스 모두 읽기/쓰기가 가능하도록 하려면 2개의 PIPE가 필요하다.
  • 버퍼가 상대적으로 작기 때문에, 오버플로우가 발생할 가능성이 높다.
  • 부모, 자식 프로세스처럼 통신할 프로세스를 알 수 있는 경우에만 사용할 수 있다.

 

2) Named PIPE

위의 Anonymous PIPE와 유사하지만, 통신할 프로세스를 모를 경우에도 사용할 수 있다. 그 이유는 통신을 위해 파일을 사용하기 때문이며, 이름 있는 파일을 매개체로 프로세스 간의 통신이 이뤄진다.

  • Anonymous PIPE와 유사한 구조를 띤다.
  • 서로 통신할 프로세스를 알 수 없는 경우에도 사용할 수 있다.

 

 

3) Message Queue

입출력 방식은 Named PIPE와 동일하지만, Named PIPE는 데이터 흐름을, Message Queue는 메모리 공간을 전달한다. 사용할 데이터에 번호를 붙여 프로세스들은 해당 번호를 통해 메시지에 접근할 수 있다.

  • 큐에서 관리되기 때문에, I/O처리가 긴 프로세스의 경우에는 나중에 처리할 수 있다.
  • 여러 개의 프로세스가 큐에 메시지를 보내거나, 큐에서 메시지를 꺼내올 수 있다.
  • 큐에 메시지를 넣고 빼는 과정에서 오버헤드가 발생할 수 있다.
  • 큐에 데이터가 많이 쌓일 경우, 추가적인 메모리 확보가 필요하다.

 


5. IPC 종류 : Socket

1) Socket (UDS, Unix Domain Socket)

네트워크를 통해 프로세스 간의 통신을 지원하는 방식이다. 따라서 같은 도메인 내에서 연결할 수 있다. 요청을 하는 클라이언트와 연결을 수행하는 서버 단으로 나누어 환경을 구축하고, 두 프로세스는 연결 요청과 요청 승인을 통해 데이터를 주고받을 수 있다.

  • 원격에서 데이터를 공유할 때 사용한다.
  • 서버와 클라이언트 구조의 양방향 통신이 가능하다.

 


6. 정리

  Shared
Memory
Memory
Map
PIPE Named PIPE Message
Queue
Socket
사용 시기 다른
프로세스와의
양방향 통신
다른
프로세스와의
양방향 통신
부모 자식
프로세스 간의
단방향 통신
다른
프로세스와의
단방향 통신
다른
프로세스와의
단방향 통신
다른
시스템과의
양방향 통신
공유 매개체 메모리 메모리 + 파일 파일 파일 메모리 소켓
통신 범위 동일 시스템 동일 시스템 동일 시스템 동일 시스템 동일 시스템 동일 + 외부
시스템

 

댓글