안녕하세요. 공유민입니다.
이번 시간에는 IPC에 대해 포스팅하겠습니다.
- IPC 소개
- IPC 구현 방법
- PIPE
Process는 완전히 독립된 실행객체이다. 서로 독립되어있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있다. 그러나 독립되어 있으니 만큼 별도의 설비가 없이는 서로간에 통신이 어렵다는 문제가 있다.
이를 위해서 커널영역에서 IPC라는 내부 프로 세스간 통신 (Inter Process Communication)을 제공한다. 프로세스는 커널이 제공하는 IPC설비를 이용해서 프로세스간 통신을 할 수 있다.
일반적으로 생각하는 파이프와 비슷하게 동작한다. 파이프는 두개의 프로세스를 연결한다. 하나의 프로세스는 단지 데이터를 쓰기만 하고 다른 하나의 프로세스는 단지 읽기만 할 수 있다. 한쪽 방향으로만 통신이 가능한 이러한 파이프의 특징 때문에 Half-duplex 통신 (반이중 통신) 라고 부르기도 한다.
- FIFO(Named PIPE)
- Named PIPE 통신
- Message Queue
- 공유 메모리 (Shared Memory)
- 공유메모리 영역을 생성을 요청한다.
- 공유메모리를 자신의 프로세스에서 맵핑해서 사용할 수 있도록 요청한다.
- 공유메모리를 사용한다.
- 공유메모리는 비교적 간단하게 사용할 수 있다. 또한 커널메모리영역에서 관리하기 때문에 매우 빠르게 접근가능하다는 장점도 가진다.
- 커널설정에 종속적이기 때문에, 사용하기전에 커널에서 허용하고 있는 공유메모리 세그먼트의 크기를 확인해야 한다.
- 공유메모리는 메시지 전달 방식이 아니기 때문에 데이터를 읽어야되는 시점을 알 수 없다는 단점을 가진다. 이 문제를 해결하려면 다른 IPC 설비들을 응용해야 한다.
- Memory Map
- 메모리맵은 파일을 메모리에 대응시킴으로써, 프로세스간 메모리를 서로 공유할 수 있다는 IPC(:12)로서의 장점을 가진다는 것을 알 수 있다.
- 메모리의 내용을 파일로 남길 수 있다는 점이다.
- 세마포어(Semaphore)
- 세마포어로 제어할 자원을 할당한다.
- 해당자원을 사용하기전에 세마포어 값을 확인한다.
- 세마포 값이 0보다 크면 자원을 사용하고, 세마포어 값을 1감소 시킨다.
- 세마포어 값이 0이면 값이 0보다 커질때까지 block되며, 0보다 커지게 되면 2번부터 시작하게 된다.
- busy wait 상태에 놓이지 않는다.
- 커널에서 관리되기 때문에 다른 프로세스들간에도 사용할 수 있다.
- 세마포어를 제어하기 위해서는 P함수와 V함수를 사용해야 하는데, 이 두개의 함수는 독립적이다. 때문에 잘못사용하게 될경우 deadlock에 빠질 수 있다.
- Socket
파이프와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하기 때문에 만약 읽기와 쓰기 즉 송 수신을 모두 하길 원한다면 위처럼 두 개의 파이프를 만들어야만 한다.
두 개의 차이점이라면 named pipe 는 사용할 pipe를 명명할 수 있다는 점이 될 것이다. pipe는 사용할 파이프를 명명할 수가 없다. 이런 의미에서 pipe는 때때로 익명 pipe라고 부르기도 한다.
(익명) 파이프는 데이터 통신을 할 프로세스가 명확하게 알 수 있을 때 사용한다. 그 예로는 부모 프로세스와 자식 프로세스간에 통신이다.
반면 전혀 모르는 프로세스들 사이에서 pipe 통신을 하는 경우는 pipe에 이름이 필요하다. named pipe는 파일로 존재하고 이 파일의 이름이 name이 된다. name만 알고 있다면 어떤 프로세스라도 접근이 가능하다.
named pipe를 이용하면 전형적인 서버/클라이언트 모델을 따르는 프로그램의 작성이 가능하다. 시스템 프로그래밍에서도 이러한 서버/클라이언트 모델은 매우자주 사용된다. 인터넷에서의 서버/클라이언트 보다 그 역사도 오래되었다고 볼 수 있다.
Queue(큐)는 선입선출의 자료구조를 가지는 통신설비로 커널에서 관리한다. 입출력 방식으로 보자면 named pipe와 동일하다고 볼 수 있을 것이다. named pipe와 다른 점이라면 name pipe가 데이터의 흐름이라면 메시지큐는 메모리공간이라는 점이다. 파이프가 아닌, 어디에서나 물건을 꺼낼수 있는 컨테이너 벨트라고 보면 될 것이다.
메시지큐의 장점은 컨테이너 벨트가 가지는 장점을 그대로 가진다. 컨테이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이, 메시지큐에 쓸 데이터에 번호를 붙임으로써, 여러개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
공유메모리가 데이터 자체를 공유하도록 지원하는 구현 방법이다. 프로세스가 공유메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스든지 해당 메모리영역에 접근할 수 있다. 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있어 IPC 중 가장 빠르다.
공유메모리는 다음과 같은 과정을 거쳐서 사용한다.
장점
단점
메모리맵도 공유메모리 공간과 마찬가지로 메모리를 공유한다는 측면에 있어서는 서로 비슷한 측면이 있다. 다른점은 메모리맵의 경우 열린파일을 메모리에 맵핑시켜서, 공유한다는 점일 것이다. 파일은 시스템전역적인 자원이니 서로 다른 프로세스들끼리 데이터를 공유하는데 문제가 없을 것임을 예상할 수 있다.
장점
세마포어는 자원에 대한 접근을 제어하기 위한 목적으로 사용된다. 세마포어 그 자체가 데이터를 공유하기 위한 어떤 공간을 제공하지는 않는다는 얘기다. 대게의 경우에는 다른 IPC 설비를 지원하기 위한 이유로 사용된다.
작동원리
장점
단점
Socket는 물리적으로 멀리 떨어져 있는 컴퓨터끼리의 통신을 도와주기 위한 통신계층이다.
장점
Unix Domain Socket(이하 소켓)의 가장 큰 장점은 네트워크 통신에 사용하던 기술을 그대로 사용할 수 있다는 점일 것이다. 코딩의 일관성을 유지할 수 있도록 도와준다. 얻을 수 있는 장점은 단지 함수(:12)를 그대로 사용할 수 있다는 점 이상이다. 다수의 클라이언트를 동시에 처리하기 위한 방법, 메시지 관리를 위한 방법 파이프로도 충분한 간단한 프로그램에 소켓을 사용하는 건 비효율적이긴 하지만 어느정도 이상의 규모가 된다면 소켓을 이용하는 걸 추천한다.
도움이 되셨다면 공감부탁드립니다. 감사합니다.