프로세스는 독립적이다. 그 말은 즉슨 프로세스는 다른 프로세스로 부터 아무 영향을 받지 않는 다는 것이다.
그렇다면, 이러한 독립적인 프로세스가 다른 프로세스와 통신해야하는 상황에는 어떻게 할 수 있을까?
이를 가능하도록 해주는 것이 IPC다.
프로세스는 커널에서 제공하는 IPC 설비를 통해서 프로세스간 통신을 할 수 있다.
IPC는 여러가지 종류가 있다. 알아보도록 하자
파이프는 두 개의 프로세스를 연결하는데, 하나의 프로세스만 쓰기가 가능하고 다른 한쪽은 읽기만 가능한 구조로 되어있다.
한쪽 방향으로만 통신하는 반이중 통신이다. 따라서 양쪽으로 모두 송/수신을 하고 싶으면 2개의 파이프를 만들어야 한다.
매우 간단하게 사용할 수 있는 장점이 있고, 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이다. 단점으로는 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해지게 된다.
익명 파이프는 통신할 프로세스를 아는 경우에 사용한다. (부모-자식 프로세스)
네임드 파이프는 서로 다른 프로세스끼리 통신할 때 사용된다.
그러나 이 파이프도 반이중 통신이기 때문에, 양방향 통신을 하려면 두 개의 파이프를 설치해야한다.
입출력 방식은 네임드 파이프와 비슷하다.
다만 다른점은 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
사용할 데이터에 번호를 붙여 여러 프로세스가 동시에 데이터를 다룰 수 있다.
파이프, 공유 메모리가 통신을 위한 장비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비다.
프로세스 메모리 영역은 독립적으로 가지며 다른 프로세스가 접근하지 못하도록 보호해야한다.
하지만 다른 프로세스가 데이터를 사용해야할 때가 있다.
파이프를 통해 전달할 수 있지만, 스레드처럼 메모리를 공유하는 방법으로 사용해도 된다.
공유메모리는 프로세스간 메모리영역을 공유해서 사용할 수 있도록 해준다.
프로세스 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스 메모리 공간에 할당해주고 메모리 영역에 접근할 수 있도록 해준다.
- 중개자 없이 메모리에 접근할 수 있으므로 IPC중에 가장 빠르게 작동한다.
공유 메모리처럼 메모리를 공유해준다.
메모리 맵은 열린 파일을 메모리에 매핑시켜서 공유하는 방식이다. (즉 공유 매체가 파일 + 메모리)
주로 대용량 파일을 공유할 때 사용한다.
네트워크 소켓을 통해서 네트워크 통신으로 데이터를 공유했다.
클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스간 데이터를 공유할 때 사용한다.
서버(bind, listen, accept) 클라이언트(connect)
이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)