IPC(Inter-Process Communication) 방식
프로세스는 서로 독립적으로 실행된다. 이러한 프로세스 간 통신을 해야할 때는 IPC 통신을 사용한다. 기본적으로 메시지 패싱과 공유 메모리 방식이 있다.
프로세스 간 협력이 왜 필요할까
- 자원을 공유하기 위해
- 작업의 속도 향상을 위해
- 모듈화를 위해
왼쪽이 공유 메모리 , 오른쪽이 메시지 패싱 (direct방식)이다.
Message Passing(메시지 패싱)
memory protection을 위해 커널이 대리 전달한다. receive와 send 시스템 콜을 이용하여 메시지를 전달한다. 따라서 OS의 간섭이 지속적으로 필요하다. 안전하고 동기화 문제가 발생하지 않으나 커널이 대신 전달하므로 시간이 오래 걸려 성능이 좋지 않다. 또한 시스템 콜이 매번 사용하므로 오버헤드 발생할 수 있다.
커널이 직접 전달하는지에 따라 direct / indirect communication으로 나눌 수 있다.
-
direct communication: 프로세스 a가 커널에 (프로세스 b에 보낼)메시지를 직접 전달하고, 커널이 프로세스 b에게 그 메시지를 전달하는 방식
-
indirect communication: 프로세스 a가 b에게 ‘커널에 메시지 박스abc에 넣어두었으니 확인해’라고 하면 b가 메시지 박스에 가서 읽어오는 방식
문제점
커널을 거쳐 전달하기 때문에 전달하는 내용이 목적지에 도착하기 전에 또 보내라는 메시지를 받을 경우가 발생할 수 있다. 이러한 경우 동기적으로 처리하는 것을 blocking 이라고 하는데, 원하는 작업을 수행할 때까지 나머지 접근에 대해 block을 거는 것이다. 반대로 Non-blocking 방식은 작업 수행과 관계 없이 block 걸지 않고 오는 대로 반응하는 것이다.
Shared Memory(공유 메모리)
각 프로세스 간 공유된 공간을 생성한 후 다른 프로세스에서 그 공간에 접근하여 이용한다. 처음 생성과 접근 시 시스템 콜을 사용하는데, 그 이후에는 커널 영역에서 작업하지 않는다. 메시지 패싱과 달리 중개자가 없어 바로 메모리에 접근할 수 있어 IPC 중 가장 빠르게 작동하지만, 동기화 문제가 발생한다. 지속적으로 교류가 많을 때 사용하는 것이 유리하다.
Producer-Consumer Problem
정보를 생산하는 Producer와 정보를 소비하는 Consumer 프로세스가 있다. 이 두 프로세스는 같은 공간을 공유한다. 두 프로세스가 생산과 소비를 반복하면서 문제가 발생할 수 있다.
- 생산자가 생산하려고 할 때 더 이상 저장할 공간이 없는 문제가 발생할 수 있고,
- 이 공간에 소비자가 더 이상 소비할 아이템이 없는 경우가 발생할 수 있다.
이 문제를 해결하는 것을 생산자-소비자 협동이라 하며, 버퍼가 동기화되어 정상적으로 동작하는 상태를 뜻한다. 문제를 해결하기 위해 세마포어를 활용할 수 있다.