IPC, Inter-Process Communication
IPC, Inter-Process Communication
앞선 포스팅에서도 많이 살펴봤듯이, 프로세스는 독립적으로 실행된다. 프로세스와 흔히 비교되는 게 스레드인데, 스레드는 대부분의 메모리 공간을 공유하며 한 프로세스 내의 스레드끼리는 공유 자원을 가진다. 하지만 프로세스는 개별적으로 메모리 공간을 가지며 독립적으로 실행된다.
이러한 프로세스끼리도 통신할 수 있도록 한 기법이 바로 IPC이다.
❓ IPC, Inter-Process Communication
IPC는 말 그대로 프로세스 사이의 통신 기법을 의미한다. 프로세스는 유저 공간에서 독립적으로 돌아가고 있기 때문에 서로에게 영향을 끼치지 않지만, 통신이 어렵다는 단점이 있다. 이러한 문제를 해결하기 위해 커널 영역에서 IPC라는 프로세스 간 통신을 제공한다.
❓ 커널, Kernel
운영체제 자체도 소프트웨어이기 때문에, 메모리에 올라가야 사용할 수 있다. 하지만 메모리 공간의 제약으로 운영체제 중 항상 필요한 부분만을 메모리에 올려놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이때 메모리에 상주하는 운영체제의 부분을 커널이라 한다.
즉, 커널은 메모리에 상주하는 부분으로써, 운영체제의 핵심적인 부분을 말한다.
IPC 설비 종류
프로세스 간 통신에도 상황에 맞는 IPC 설비를 선택할 수 있도록 다양한 설비들이 존재한다. 잘못된 IPC 설비의 선택은 코딩 과정을 어렵게 만들거나 프로그램의 작동을 효율적이지 못하게 만들 수 있기 때문에 올바른 설비를 사용하는 것이 매우 중요하다.
PIPE, 익명 PIPE, Anonymous PIPE
파이프는 두 프로세스를 연결하고 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있는 반이중(Half-Duplex) 통신 설비이다.
위 그림과 같이 한쪽 반향으로만 가능하므로, 만약 읽기와 쓰기, 즉 송수신을 모두 하길 원한다면 파이프 두 개를 만들어야 한다.
장점
- 매우 간단하게 사용할 수 있다.
- 단방향 통신이 필요한 경우 사용하면 좋다.
단점
- 양방향 통신이 필요하다면 파이프 두 개를 만들어야 하기 때문에 구현이 복잡하다. 다른 설비를 선택하는 것이 더 좋다.
- 통신할 프로세스를 명확하게 알 수 있는 경우에만 사용해야 한다. 예를 들어 부모와 자식 프로세스간 통신, 같은 PPID를 가지는 프로세스 간 통신만 가능하다.
Named PIPE, FIFO
이름이 있는 파일을 사용하기 때문에, 부모 프로세스와 무관하게 서로 전혀 모르는 프로세스 간 통신에 사용할 수 있다. 익명 PIPE의 확장이라 볼 수 있다.
Named PIPE의 생성은 mkfifo를 통해 이루어지는데, mkfifo가 성공하면 명명된 파일이 생성된다.
장점
- 익명 파이프와는 다르게, 서로 전혀 모르는 프로세스 간 통신에 사용할 수 있다.
단점
- 익명 파이프와 같이 읽기 쓰기가 동시에 불가능하다. 전이중 통신을 위해서는 결국 두 개의 FIFO 파일이 필요하다.
Message Queue, 메시지 큐
Queue는 선입선출 특성을 가지는 통신 설비로, 커널에서 관리한다. Message Queue를 메모리 공간으로 사용하여, Queue에 쓸 데이터에 번호를 붙임으로써 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
장점
- 비동기 방식이기에 방대한 처리량이 있다면 큐에 넣은 후 나중에 처리할 수 있다.
- 다수의 프로세스들이 큐에 메시지를 보낼 수 있고, 다수의 프로세스들이 큐로부터 메시지를 꺼낼 수 있다.
- 분산 처리 및 경쟁 처리 방식에 사용할 수 있다.
단점
- 메시지가 정말 잘 전달되었는지 알 수 없다.
- 큐에 데이터를 넣고 나오는 과정에서 오버헤드가 발생할 수 있다.
- 데이터가 많이 쌓일수록 추가적인 메모리 자원이 필요하다.
Shared Memory, 공유 메모리
프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용하는 설비이다.
프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다.
장점
- 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에, 다른 모든 IPC들 중에서 가장 빠르게 작동한다.
단점
- 커널 설정에 종속적이기 때문에, 사용하기 전에 커널에서 허용하고 있는 공유 메모리 사이즈를 확인해야 한다.
Memory Map
Shared Memory와 비슷하게 공유 메모리를 사용하며, 열린 파일을 메모리에 Mapping 시켜서 공유하는 설비이다.
파일은 시스템의 전역적인, 즉 모두 공유할 수 있는 자원이므로 서로 다른 프로세스들끼리 데이터를 공유하는 데에 문제가 없다.
장점
- 데이터가 메모리에 이미 올라와 있는 것처럼 간단하게 접근할 수 있다.
- 일반적인 파일 I/O에 비해 나은 성능을 보여준다.
- 비동기 I/O를 사용하지만 시스템에서 처리해주기 때문에 걱정할 필요가 없다.
단점
- 일반 파일 I/O에 비해 상당히 많은 메모리가 요구된다.
- 많은 데이터를 얼마나 오랫동안 메모리에 둘 것인지 컨트롤 할 수 없다.
Socket
같은 도메인 내에서 연결될 수 있고, 네트워크를 통해 프로세스들 사이의 통신을 가능하게 하는 설비이다.
소켓 연결 과정
- 소켓을 생성하고 이름을 지정한다. domain, type, protocol을 지정한다.
- 서버 : bind, listen, accept를 통해 소켓 연결을 위한 준비를 한다.
- 클라이언트 : connect를 통해 서버에 연결을 요청하고, 연결 수립 후에는 socket에 send를 함으로써 데이터를 주고 받는다.
- 연결이 끝나면 반드시 close()로 clear한다.
장점
- 서버/클라이언트 환경을 구축하는 데에 용이하다.
- Internet Socket인 경우 데이터 유실이 발생할 수 있지만, Unix Domain 소켓은 PIPE와 같은 형태로 이루어지고 같은 시스템에서 교환이 일어나므로 패킷이 유실되거나 순서가 바뀌는 등의 문제는 발생하지 않는다.
- 범용적인 IPC로 양방향 통신이 가능하다.
- 패킷 단위로 주고 받음으로, 직관적으로 이해하기 쉬운 코드를 만들 수 있다.
단점
- Internet UDP와는 달리 경로를 지정할 수 없기 때문에, 다중 클라이언트를 받아들이는 서버의 경우 문제가 될 수 있다.
요약
참고자료
IPC의 종류와 특징
IPC(Inter Process Communication) - 프로세스 간 통신에 대하여 종류와 특징들에 대하여 살펴보겠습니다. [리눅스 커널 구조] - 위 그림처럼 Process는 완전히 독립된 실행객체입니다. 서로 독립되어 있다는
jwprogramming.tistory.com
[운영체제] IPC Inter-Process Communication
IPC란? 프로세스는 독립적으로 실행된다. 이처럼 독립적인 공간을 가진 프로세스 간 통신에 사용되는 기법이 IPC 통신이다. 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간의 통신을
yaelimeee.tistory.com
[OS/운영체제] IPC란? - 정의, 종류, 방법
IPC(Inter Process Communication)란? 정의 IPC의 종류 >IPC = 프로세스 간 통신 >프로세스들끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법을 뜻한다. 위 그림처럼 Process는 완전히 독립된 실행객체
velog.io