위 그림처럼 Process는 완전히 독립된 실행객체이다. 서로 독립되어 있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있다. 하지만 독립되어 있는 만큼 별도의 설비가 없이는 서로 간에 통신이 어렵다는 문제가 생긴다. 이를 위해서 커널 영역에서 IPC라는 내부 프로세스 간 통신(nter Process Communication)을 제공하게 되고, 프로세스는 커널이 제공하는 IPC설비를 이용해서 프로세스 간 통신을 할 수 있게 된다.
PIPE와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하므로 읽기와 쓰기, 즉 양방향 송/수신을 원한다면 두개의 파이프를 만들어야만 가능해진다.
이때, PIPE는 매우 간단하게 사용할 수 있다는 장점이 있다. 만약 한쪽 프로세스가 단지 읽기만 하고 다른 쪽 프로세스는 단지 쓰기만 하는 데이터 흐름을 가진다면 PIPE를 사용하는 것이 편하다. 하지만 단점으로는 반이중 통신이라는 점으로 프로세스가 읽기와 쓰기 통신 모두를 해야 한다면 PIPE를 두개 만들어야 하는데, 구현이 꽤나 복잡해 질 수 있다. 만약 전이중 통신을 고려해야 될 상황이라면 PIPE는 좋은 선택이 아니라고 보여 진다.
명명 파이프(Named Pipe)는 통신을 할 프로세스를 명확하게 알 수 있는 경우 사용한다. 예를 들어 자식과 부모 프로세스 간 통신의 경우에 사용될 수 있다. 또한, Named PIPE는 ①의 PIPE 단점 중 하나인 같은 PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능한 점을 보안한 PIPE의 확장이라고 할 수 있다. Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문이다. Named PIPE의 생성은 mkfifo를 통해 이뤄지며, mkfifo가 성공하면 명명된 파일이 생성된다.
단점으로는, Named PIPE도 PIPE의 또 다른 단점인 읽기/쓰기가 동시에 가능하지 않으며, read-only, write-only만 가능합니다. 하지만 통신선로가 파일로 존재하므로 하나를 읽기 전용으로 열고 다른 하나를 쓰기전용으로 영어서 이러한 read/write문제를 해결 할 수 있습니다. 호스트 영역의 서버 클라이언트 간에 전이중 통신을 위해서는 결국 PIPE와 같이 두개의 FIFO파일이 필요하게 됩니다.
Queue는 선입선출의 자료구조를 가지는 통신설비로 커널에서 관리한다. 입출력 방식으로 보면 Named PIPE와 동일하다고 볼 수 있다. 하지만 Name PIPE가 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점이 다르다. 파이프가 아닌, 어디에서나 물건을 꺼낼 수 있는 컨테이너 벨트라고 생각해도 좋다.
메시지 큐의 장점은 컨테이너 벨트가 가지는 장점을 그대로 가지게 된다. 컨테이너 벨트에 올라올 물건에 라벨을 붙이면 동시에 다양한 물건을 다룰 수 있는 것과 같이, 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
데이터를 공유하는 방법에는 크게 두 가지가 있다. 하나는 통신을 이용해서 데이터를 주고받는 것이고 다른 하나는 데이터를 아예 공유, 즉 함께 사용하는 것이다. PIPE, Named PIPE, Message Queue가 통신을 이용한 설비라면, Shared Memory는 공유메모리가 데이터 자체를 공유하도록 지원하는 설비이다.
프로세스는 자신만의 메모리 영역을 가지고 있다. 이 메모리 영역은 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해서 보호가 되는데, 만약 다른 프로세스의 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV 시그널을 보내 보호한다.
다수의 프로세스가 동시에 작동하는 Linux 운영체제의 특성상 프로세스의 메모리 영역은 반드시 보호되어져야 한다. 하지만 메모리 영역에 있는 데이터를 다른 프로세스들도 사용할 수 있도록 해야 하는 경우도 발생할 수 있다. PIPE와 Message Queue등을 이용해서 데이터 통신을 이용하여 데이터를 전달하는 방법도 있지만, Thread에서처럼 메모리 영역을 공유한다면 더 편하게 데이터를 함께 사용할 수 있다.
따라서 Shared Memory는 프로세스 간에 메모리 영역을 공유하여 사용할 수 있도록 한다. 프로세스가 공유 메모리 할당을 커널에 요청하게 되면 커널은 해당 프로세스에 메모리 공간을 할당해주게 되고, 이후 어떤 프로세스이던 간에 해당 메모리영역에 접근할 수 있다. 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동할 수 있다는 장점도 가지고 있다.
Memory Map도 Shared Memory와 마찬가지로 메모리를 공유한다는 측면에 있어서는 비슷한 측면이 있다. 차이점으로는 Memory Map의 경우 열린 파일을 메모리에 Mapping시켜 공유한다는 점이다. 파일은 시스템의 모두 공유할 수 있는 자원이므로 서로 다른 프로세스들끼리 데이터를 공유하는데 문제가 없을 것임을 예상할 수 있다.
Socket은 프로세스와 시스템의 basic한 부분으로, 프로세스 들 사이의 통신을 가능하게 한다. 소켓을 사용하기 위해서는 소켓을 생성해주고, 이름을 지정해주어야 한다. 또한 domain과 type, Protocol을 지정해 주어야 한다. 서버 부분에서는 bind, listen, accept를 해주어 소켓 연결을 위한 준비를 하고, 클라이언트 부분에서는 connect를 통해 서버에 요청하며, 연결이 수립 된 이후에는 Socket을 send함으로써 데이터를 주고받게 된다. 연결이 끝난 후에는 반드시 Socket을 close()해야 한다.
Semaphore는 Named PIPE, PIPE, Message Queue와 같은 다른 IPC설비들이 대부분 프로세스 간 메시지 전송을 목적으로 하는데 반해, Semaphore는 프로세스 간 데이터를 동기화 하고 보호하는데 그 목적을 두게 된다. PIPE와 Message Queue와 같이 프로세스 간 메시지 전송을 하거나, Shared Memory를 통해서 특정 데이터를 공유하게 될 경우 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 안 되며, 단지 한 번에 하나의 프로세스만 접근 가능하도록 만들어주는 것이 Semaphore이다.