프로세스는 완전히 독립된 실행객체이기 때문에, 서로 독립되어 있는 다른 프로세스의 영향을 받지 않는다는 장점이 있는 반면에 독립되어 있는 만큼 별도의 설비 없이는 서로간의 통신이 어렵다는 문제점이 존재합니다.
따라서 커널 영역에서 IPC라는 내부 프로세스간 통신(IPC) 를 제공하며 이를 이용해서 프로세스간의 통신을 할 수 있습니다.
각각의 상황에 따라 적당한 통신 설비들이 준비되어야 하는 것 처럼, 내부 프로세스간 통신에도 그 상황에 맞는 IPC 설비를 선택해야 합니다.
파이프는 두 개의 프로세스를 연결하며 하나의 프로세스는 데이터를 쓰기전용 다른 하나는 읽기 전용입니다. 한 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고도 부릅니다.
PIPE와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하므로 만약 읽기와 쓰기, 즉 송/수신을 모두 하기 원한다면 양방향으로 두개의 파이프를 만들어야 합니다. 하지만 구현이 꽤나 복잡해 질 수 있는 단점이 있습니다.
만약 한쪽 프로세스가 읽기만 하고 다른 쪽 프로세스는 쓰기만 하는 단순한 데이터 흐름을 가진다면 PIPE를 사용하면 됩니다.
익명 PIPE는 부모와 자식 프로세스간의 통신처럼 통신을 할 프로세스가 명확하게 알 수 있는 경우에 사용하지만, Named PIPE는 전혀 모르는 상태의 프로세스들 사이의 통신에 사용됩니다.
Named PIPE는 PIPE의 단점중 같은 PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능한 것을 해결한 PIPE의 확장형으로 볼 수 있습니다.
Named PIPE는 부모 프로세스와 무관하게 전혀 다른 프로세스들 사이에서 통신이 가능합니다. 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문입니다. Named PIPE의 생성은 mkfifo를 통해 이뤄지며, 성공시에 명명된 파일이 생성 됩니다.
Queue(큐)는 선입선출(FIFO) 의 자료구조를 가지는 통신설비로 커널에서 관리합니다. 입출력 방식으로 보면 위의 Named PIPE와 동일합니다.
Named PIPE와 다른 점이라면 Name PIPE가 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점입니다. 파이프와 같은 통로가 아닌, 어디에서나 물건을 꺼낼 수 있는 컨테이너 벨트라고 보면 될 것입니다.
메시지 큐의 장점은 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있습니다.
데이터를 공유하는 방법에는 두 가지가 있습니다. 1) 통신을 이용하여 데이터를 주고 받거나, 2) 데이터를 공유하여 함께 사용하는 것 입니다.
PIPE, Named PIPE, Message Queue가 통신을 이용한 설비라면 Shared Memory는 공유메모리가 데이터 자체를 공유하도록 지원합니다.
프로세스는 자신만의 메모리 영역을 가지고 있으며, 다른 프로세스가 접근하지 못하도록 커널에 의해 보호가 됩니다. 커널은 침범 프로세스에 SIGSEGV(경고 시그널 - 할당된 메모리의 범위를 벗어나는곳에서 읽거나, 쓰기를 시도할 때 발생) 를 보내게 됩니다.
다수의 프로세스가 동시에 작동하는 Linux 운영체제와 같은 상황에서 프로세스의 메모리 영역은 반드시 보호되어 져야 하지만, 메모리 영역에 있는 데이터를 다른 프로세스들에게 공유해야 하는 경우도 필요할 수 있습니다.
프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 공유 메모리 공간을 할당해 주며, 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있습니다.
공유 메모리는 중개자가 없이 곧바로 메모리에 접근하므로 다른 모든 IPC들 중에서 가장 빠르게 작동합니다.
Memory Map도 Shared Memory(공유메모리) 와 비슷한 측면이 있습니다. 차이점은 Memory Map의 경우 열린파일을 메모리에 매핑시켜 공유합니다.
파일은 시스템의 전역적인 자원이라 프로세스간의 공유에 문제가 없습니다.
Socket은 프로세스들 사이의 통신을 가능하게 합니다.
sys/socket.h 라는 헤더를 이용하여 사용할 수 있으며, 같은 도메인에서의 경우에 연결될 수 있습니다. 소켓을 사용하기 위해서는 생성뒤 이름을 지정해야 합니다.
Semaphore는 프로세스 간 데이터를 동기화 하고 보호하는데 목적이 있습니다. 프로세스 간 메시지를 전송하거나 혹은 공유 메모리를 통해 특정 데이터를 공유하게 될 경우 발생하는 동기화 문제를 해결하기 위한 기법입니다.