OS/프로세스 관리

프로세스간 통신(Interprocess Communication)

검정비니 2018. 11. 4. 14:40
728x90
반응형

프로세스간 통신 (Interprocess Communication)


프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스 간에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.



특정 프로세스가 다른 프로세스들에게 영향을 주거나 받지 않는다면 독립적인 프로세스라고 말하고, 다른 프로세스들에게 영향을 주거나 받는다면 협력적인 프로세스라고 말한다.



프로세스가 협력할 수 있는 환경을 제공하는 데는 몇 가지 이유가 있다.


- 정보 공유 (Information sharing)


여러 사용자가 동일한 정보에 흥미를 가질 수 있으므로, 그러한 정보를 병행적으로 접근할 수 있는 환경을 제공해야 한다.


- 모듈성 (Modularity)


시스템 기능을 별도의 프로세스들 또는 스레드들로 나누어 시스템을 모듈식 형태로 구성할 경우, 각 시스템 모듈이 서로 협력하게 만들기 위해서


- 계산 가속화 (Computation speedup)


만일 우리가 특정 작업을 빨리 실행하고자 한다면, 우리는 해당 작업을 여러 개의 서브태스크(sub-task)로 나누어서 각각 다른 서브태스크들과 병렬로 실행되게 해야 한다. 이 계산 가속화는 여러 개의 처리요소(processing element - CPU나 입출력 채널 등)들을 가진 경우에만 달성할 수 있음에 유의해야 한다.


- 편의성 (Convenience)


개별 사용자들이 동시에 작업할 여러 태스크를 가질 수도 있다. 예를 들면, 한 사용자가 편집, 인쇄, 컴파일 등을 병렬로 할 수 있다.



협력적 프로세스들은 데이터와 정보를 교환할 수 있는 프로세스간 통신(Interprocess communication - IPC) 기법을 필요로 한다. 프로세스 간 통신에는 기본적으로 공유메모리(shared memory)와 메시지 전달(message passing)의 두 가지 모델이 있다.


공유 메모리 모델에서는 협력 프로세스들 사이에 공유되는 메모리 영역이 구축된다. 프로세스들은 그 영역에 데이터를 읽고 쓰고 함으로써 정보를 교환할 수 있다. 메시지 전달 모델에서는 협력 프로세스들 사이에 교환되는 메시지를 통하여 통신이 이루어진다.




- 다음은 대표적인 IPC 통신 방법들이다.



1) 파이프 (익명 파이프 - pipe)


파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다. 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 한다. 

PIPE와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하므로 만약 읽기와 쓰기, 즉 송/수신을 모두 하기 원한다면 두개의 파이프를 만들어야만 가능해진다.

PIPE는 매우 간단하게 사용할 수 있다는 장점이 있다. 만약 한쪽 프로세스가 단지 읽기만 하고 다른  프로세스는 단지 쓰기만 하는, 단순한 데이터 흐름을 가진다면 고민 없이 PIPE 사용하면 된단점은 반이중 통신이라는 점으로 만약 프로세스가 읽기와 쓰기 통신 모두를 해야 한다면 PIPE 두개 만들어야 하는데, 구현이 꽤나 복잡해   있다. 다시말해, 만약 전이중 통신을 고려해야될 상황이라면 PIPE 좋은 선택이 아닐 것이다.


2. Named PIPE(FIFO)

익명 파이프(Pipe) 통신을  프로세스가 명확하게   있는 경우 사용한다. 예를 들어 자식과 부모 프로세스간 통신의 경우에 사용할 수 있으며, Named PIPE는 전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용한다. Named PIPE는 PIPE의 단점 중 같은 PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능하지만, Named PIPE는 그 부분을 해결한, PIPE의 확장이라고 할 수 있다. Named PIPE 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문이다. Named PIPE의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성된다.

단점으로는, Named PIPE도 PIPE의 또 다른 단점인 읽기/쓰기가 동시에 가능하지 않으며, read-only, write-only만 가능하다. 하지만 통신선로가 파일로 존재하므로 하나를 읽기 전용으로 열고 다른 하나를 쓰기전용으로 여는 방식으로 이 문제를 해결 할 수 있다. 호스트 영역의 서버 클라이언트 간에 전이중 통신을 위해서는 결국 PIPE와 같이 두개의 FIFO파일이 필요하게 된다.


3) Message Queue

Queue() 선입선출의 자료구조를 가지는 통신설비로 커널에서 관리한다. 입출력 방식으로 보자면 위의 Named PIPE 동일하다고   있을 것이다. Named PIPE 다른 점이라면 Name PIPE 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점이다. 파이프가 아닌, 어디에서나 물건을 꺼낼  있는 컨테이너 벨트라고 보면 된다.

메시지 큐의 장점은 컨테이너 벨트가 가지는 장점을 그대로 가지게 된다. 컨테이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰  있는 것과 같이, 메시지 큐에  데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰  있다.


4) Shared Memory (공유 메모리)

위에서 언급한 것처럼, 데이터를 공유하는 방법에는 크게  가지가 있다. 하나는 통신을 이용해서 데이터를 주고 받는 것이고 다른 하나는 데이터를 아예 공유 함께 사용하는 것이. PIPE, Named PIPE, Message Queue 통신을 이용한 설비라면, Shared Memory는 공유메모리가 데이터 자체를 공유하도록 지원하는 설비이다.

프로세스는 자신만의 메모리 영역을 가지고 있다.  메모리 영역은 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해서 보호가 되는데, 만약 다른 다른 프로세스의 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV(경고 시그널 - 할당된 메모리의 범위를 벗어나는곳에서 읽거나, 쓰기를 시도할 때 발생)  보내게 된다.

Shared Memory(공유 메모리)는 프로세스간 메모리 영역을 공유해서 사용할  있도록 허용한. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 다른 프로세스들과 공유할 수 있는 특수한 메모리 공간을 할당해준다. 이후 어떤 프로세스건 해당 메모리영역에 접근할  있다.

공유메모리는 중개자가 없이 곧바로 메모리에 접근할  있기 때문에 다른 모든 IPC 중에서 가장 빠르게 작동할 수 있다.


5). Memory Map

Memory Map도 Shared Memory(공유메모리)공간과 마찬가지로 메모리를 공유한다는 측면에 있어서는 서로 비슷한 측면이 있다. 차이점은 Memory Map의 경우 열린파일을 메모리에 맵핑시켜서, 공유한다는 점이. 파일은 시스템의 전역적인(모두 공유할 수 있는) 자원이므로 서로 다른 프로세스들끼리 데이터를 공유하는데 문제가 없다는 점을 이용한 방식이다.

반응형