IPC
프로세스 간 통신을 의미하여 프로세스들끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법을 뜻한다. 프로세스는 완전히 독립된 실행객체이다. 서로 독립되어 있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있지만, 별도의 설비 없이는 서로간의 통신이 어렵다는 단점이 있다.
이 통신을 위해 커널 영역에서 CPU라는 내부 프로세스 간 통신을 제공하고, 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간 통신을 할 수 있게 된다.
커널
운영체제의 한 부분으로 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하고 컴퓨터 자원을 관리하기도 한다. 운영체제도 결국 소프트웨어기에 메모리에 올려야 사용할 수 있는데 메모리 공간에 제약이 있기 때문에 운영체제 중 항상 필요한 부분만을 메모리에 올리고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용한다. 이때 메모리에 상주하는 운영체제의 부분을 커널이라고 한다.
IPC의 종류
PIPE (익명 파이프)
- 파이프는 두 개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만 하고 다른 하나는 읽기만 할 수 있다.
- 부모 자식 간에 단방향 통신으로 자주 사용하고 반이중 통신이라고도 불린다.
- 통신할 프로세스를 명확히 알 수 있는 경우에 사용(부모 자식간처럼)한다.
- 만약 송/수신을 모두 하기를 원한다면 두 개의 파이프를 만들어야 한다.
- read(), write()가 기본적으로 block mode로 작동되기에 프로세스가 read 대기중이라면 read가 끝나기 전에는 write를 할 수 없다.
장점
단점
- 전이중 통신 방식으로 활용하기 위해서는 파이프가 두개 있어야 하는데, 구현이 복잡해질 수 있다.
- buffer가 상대적으로 작기때문에 overflow가 될 확률이 높다.
- 부모 자식 관계의 프로세스들 사이에서 가능하다.
Named PIPE
- 전혀 모르는 상태의 프로세스들 사이 통신에 사용한다.
- 프로세스간에 통신을 위해 이름이 있는 파일을 매개체로 사용한다.
- mkfifo를 통해 Named PIPE를 생성하는데, mkfifo가 성공하면 이름이 명명된 파일이 생성되고 이를 활용해서 프로세스 간에 통신이 이루어진다.
- 장점 및 단점이 익명 파이프와 굉장히 비슷하다.
Message Queue
- FIFO 자료구조를 가지는 통신설비로 커널에서 관리한다.
- 입출력 방식 측면에서는 Named PIPE와 동일하다고 할 수 있다.
- Named PIPE는 데이터의 흐름이라면 Message Queue는 메모리 공간이다.
- 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
- 파이프가 아닌 어디에서나 물건을 꺼낼 수 있는 컨테이너 벨트와 같다고 생각하면 된다.
장점
- 비동기 방식이기때문에 방대한 처리량이 있다면 큐에 넣은 후 나중에 처리할 수 있다.
- 다수의 프로세스들이 큐에 메세지를 보낼 수 있고, 다수의 프로세스들이 큐로부터 메세지를 꺼낼 수 있다.
- 분산처리 및 경쟁처리 방식에 사용할 수 있다.
단점
- 메세지가 잘 전달되었는지 여부를 확인할 수 없다.
- 큐에 데이터를 삽입하고 삭제하는 과정에서 오버헤드가 발생할 수 있다.
- 데이터가 많이 쌓일수록 추가적인 메모리 자원이 필요하다.
Shared Memory
- 파이프, 메세지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비이다.
- 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해주게 되고, 이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있다.
장점
- 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중 가장 빠르게 동작한다. (커널 메모리 영역에서 관리하기에 빠르게 접근 가능)
단점
- 메세지 전달 방식이 아니기에 데이터를 읽어야하는 시점을 알 수 없다.
- 커널 설정에 종속적이기에 사용하기 전에 커널에서 허용하고 있는 공유메뫼 사이즈를 확인해야 한다.
Semaphore
- PIPE, Message Queue같은 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하나, Semaphore는 프로세스간 데이터를 동기화하고 보호하는데에 목적을 둔다.
- 하나의 자원에 하나의 프로세스만 접근 가능하게 해주는 것이 Semaphore이다.
- 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호이다.
- 한 프로세스가 자원을 사용하는 동안에 세마포어를 세워 다른 프로세스를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용한다.
장점
- Thread들은 크리티컬 섹션을 허락받아야 하기에 크리티컬 섹션에서 충돌이 나지 않는다.
단점
- Thread들은 Block을 당하기에 CPU가 대기하는 시간동안 낭비가 발생할 수 있다.
뮤텍스
뮤텍스는 이진 세마포어이다.
Memory Map
- 열린 파일을 메모리에 맵핑시켜서 공유한다.
- 파일은 시스템의 전역적인 자원(모두가 공유할 수 있는 자원)이므로 서로 다른 프로세스들끼리 데이터를 공유하는데 문제가 없다.
장점
- 데이터가 메모리에 이미 올라와있는 것처럼 간단하게 접근 가능하다.
- 일반적인 파일 IO에 비해 나은 성능을 보여준다.
- 비동기 IO를 사용하지만 시스템에서 처리해주기 때문에 스레드 문제를 걱정할 필요가 없다.
단점
- 일반 파일 IO에 비해 상당히 많은 메모리를 요구한다.
- 데이터를 얼마나 오랫동안 메모리에 둘 것인지 컨트롤할 수 없다.
Socket(소켓, UDS = Unix Domain Socket)
- 같은 도메인내에서 연결될 수 있고 프로세스들 사이의 통신이 가능하다.
- 서버단에서는 bind->listen->accept를 진해해 소켓 연결을 위한 준비를 한다.
- 클라이언트단에서는 connect를 통해 서버에 요청하고, 연결이 수립된 후에는 socket에 send함으로써 데이터를 주고 받는다.
- 연결이 끝나면 반드시 close()로 clear 한다.
- 네트워크를 통해 프로세스간의 통신을 진행한다.
장점
- 서버/클라이언트 환경을 구축하는데에 용이하다.
- Internet Socket인 경우 데이터 유실이 발생할 수 있으나 Unix Domain 소켓은 PIPE와 같은 형태로 이루어지고 같은 시스템에서 교환이 일어나므로 패킷이 유실되거나, 순서가 바뀌는 등의 문제가 발생하지 않는다.
- 범용적인 IPC로써 양방향 통신이 가능하다.
- 패킷 단위로 주고 받음으로 직관적으로 이해하기 쉬운 코드를 만들 수 있다.
단점
- Internet UDP와는 달리 경로를 지정할 수 없다. (다중의 클라이언트를 받아들이는 서버의 경우 문제가 될 수 있다.)
출처 : https://yaelimeee.tistory.com/56
참고
https://yaelimeee.tistory.com/56
https://jwprogramming.tistory.com/54
https://velog.io/@yanghl98/OS%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-IPC%EB%9E%80
https://gyoogle.dev/blog/computer-science/operating-system/IPC.html