본문 바로가기

CS/운영체제

[ 운영체제 ] 프로세스간 통신, IPC (Interprocess Communication)

반응형

프로세스는 서로 데이터를 주고 받을 일이 많다. 대표적으로 PPT 파일을 인쇄하는 과정을 생각해 보자. PPT 프로세스는 인쇄할 데이터를 프린터 프로세스에게 전송해주고, 프린터 프로세스는 전송 받은 데이터를 가지고 출력을 하면 된다. 물론 자세하게 들어가면 훨씬 복잡한 과정이지만 일단 이렇게 알아두자. 

 

'데이터를 전송한다'의 의미를 메모리 관점에서 다시 생각해보자. 메모리의 크기는 한정적이기 때문에 프로세스가 차지하는 공간도 한정적이다. 프로세스 A가 프로세스 B에게 데이터를 전송한다는 것은 프로세스 A가 프로세스 B의 메모리 공간에 접근한다는 뜻이다. 그런데 이는 굉장히 위험한 행동(?)이다. 만약에 전송하는 데이터의 크기가 프로세스 B의 데이터 공간을 넘어선다면? 프로세스 B에 오류가 발생할 것이다. 따라서 OS는 프로세스 끼리의 직접적인 메모리 접근을 금지하고 있다. 이를 'Memory Protection'이라고 한다. 그런데 프로세스끼리 데이터를 주고 받을 일이 많기 때문에 OS는 IPC(Interprocess Communication)라는 별도의 기능을 제공한다. 

 

IPC란 프로세스들 간에 데이터 및 정보를 주고받기 위한 메커니즘을 말한다. 커널에서 IPC를 위한 도구를 제공하며, 시스템 콜의 형태로 프로세스에게 제공된다. IPC에는 크게 두 가지 모델이 있다. 

1. 공유 메모리(Shared Memory) 모델 - user memory 공간
2. 메시지 전달(Message Passing) 모델 - kernel memory 공간

1.  공유 메모리(Shared Memory) 모델

두 개 이상의 프로세스들이 주소 공간의 일부를 공유하며, 공유한 메모리 영역에 읽기/쓰기를 통해서 통신을 수행하는 방법이다. 시스템 콜을 통해 공유 메모리가 설정되면, 그 이후의 통신은 커널의 관여 없이 진행 가능하다. 

공유 메모리 모델

공유 메모리 모델은 커널의 관여 없이 메모리를 직접 사용하기 때문에 속도가 빠르다는 장점이 있다. 또한 프로그램 레벨에서 통신 기능을 제공하며, 자유로운 통신이 가능하다는 장점도 있다. 하지만 공유 메모리 모델은 Producer-Consumer Problem을 발생시킬 수 있어 별도의 동기화 과정이 필요하다. 동기화 방법으로 locking과 세마포어 등이 있다. 

Producer-Consumer Problem

편하게 생산자-소비 문제라고 부르겠다. 아까 공유 메모리 모델은 읽기/쓰기를 통해 통신을 수행한다고 했다. 여기서 쓰기를 수행하는 프로세스를 Producer라고 하고, 읽기를 수행하는 프로세스를 Consumer라고 한다. PPT와 프린터 프로세스로 예를 들면 아래와 같다. 

공유 메모리는 원형 리스트 형태인데, 아래와 같은 문제가 발생할 수 있다.  

[1] Producer가 기존의 데이터를 덮어 쓰는 문제

공유 메모리가 가득 찬 경우 발생할 수 있는 문제다. Producer가 가득 찬 지 모르고 쓰기를 진행한 상황이다. Consumer가 읽지도 않았는데 overwite 한 것이다. 그림으로 표현하면 아래와 같다. 초록색 원은 기존에 쓴 것을, 적색 원은 덮어쓴 것을 표현한 것이다.

 

[2] Consumer가 쓰레기 값을 읽는 문제

공유 메모리가 비었을 때 발생할 수 있는 문제다. 공유 메모리가 비었을 경우 Consumer는 쓰레기 값을 읽게 된다. 그림으로 표현하면 아래와 같다.

 

위와 같은 문제의 해결 방안은 간단하다. 공유 메모리 공간이 비었는지, 꽉 찼는지 확인만 해주면 된다. 그러나 다른 문제가 또 있다. 이 또한 생산자-소비 문제이며 사실 이게 가장 큰 문제다.

동시 접근 문제

Producer 프로세스와 Consumer 프로세스가 정확하게 동일한 시간에 쓰기/읽기를 수행한 경우 발생할 수 있는 문제다. 동시에 쓰거나 동시에 읽는 경우도 마찬가지다. 따라서 메모리 영역에 대한 동시적인 접근을 제어하기 위한 방법이 필요하다. 커널이 따로 동기화 기능을 제공하지 않기 때문에 부가적인 방법이 필요한데, locking이나 세마포어 등으로 해결 가능하다. 이 링크에서 내용을 확인할 수 있다.

2. 메시지 전달(Message Passing) 모델

커널을 경유하여 고정길이 메시지, 가변길이 메시지를 송/수신자끼리 주고 받으며, 커널에서는 데이터를 버퍼링 하는 방식이다. 커널을 통해서 데이터를 주고 받기 때문에 통신 속도가 느리다는 단점이 있지만, 커널에서 데이터를 주고 받는 과정을 컨트롤 할 수 있어 안전하며 send/receive 연산에 대해 커널이 동기화를 제공해준다는 장점이 있다. 서버-클라이언트 방식의 통신이 대표적인 메시지 전달 모델 방식이다.

메시지 전달 방식에는 크게 Blocking 방식과 Non-Blocking 방식이 있다.

Blocking(동기): '순서대로 진행'을 의미. 다음 단계에서 이전 단계가 수행 완료됨을 보장
ex) LAN 카드로부터 패킷 하나 주세요! 기다릴게요~~

Non-Blocking(비동기): 순서 상관 없이 진행.
ex) LAN 카드로부터 패킷 여유 있으면 알려주세요. 저는 다른 일 하고 있을게요~~

 

반응형