[운영체제]프로세스간 통신
서론
이 강의는 유튜브 - 주니온TV의 운영체제 강의를 듣고 정리한 내용을 기록한 게시물입니다.
IPC
프로세스는 완전히 독립된 실행체이다.
메모리 공간도 따로 할당받고, PCB도 따로 갖게되어 서로 독립적인 공간내에서 다른 프로세스의 영향을 받지 않고 실행된다. 이러한 것이 장점이기도 하지만, 단점이기도 하다. 우리가 프로세스를 사용하다 보면 프로세스간 정보를 공유해야하거나, 함께 한 작업을 같이 해야하는 경우, 또는 모듈식으로 여러 프로세스가 하나의 프로세스처럼 동작하게 하기위해서 다른 프로세스에 접근하거나 다른 프로세스에의해 접근받는 경우가 필요한데, 프로세스의 이러한 독립성이라는 특징이 이를 어렵게 한다.
따라서 프로세스간의 통신 문제를 해결하기 위한 방법이 필요해졌는데, 이를 위한 방법이 바로 IPC(Inter-Process Communication)이다.
IPC에는 두가지 모델이 있는데
- share memory (공유 메모리)
- message passing (메시지 전송)
의 두가지 모델을 통해 프로세스간 통신을 구현한다.
Shared Memory
공유메모리 방식은 공유되는 메모리 공간을 따로 할당하여, 독립된 프로세스가 이 공유된 메모리 공간을 통해 정보를 기록하고 이를 가져다 사용하는 방식이다.
프로세스가 공유 메모리할당을 커널에 요청하게 되면 커널에서 해당 프로세스에 메모리 공간을 할당해주고, 이 공간은 어떤 프로세스건 접근할 수 있는 공유메모리가 되어 커널의 관여없이 이 공간을 통해 다른 프로세스와 함께 통신할 수 있다.
일반적으로 이 방식은 공유메모리에 버퍼를 만들어 여기에 송신측이 정보를 넣고, 수신측은 정보를 꺼내는 방식으로 구현된다.
이렇게 같은 주소공간을 공유하고 이 공유된 메모리에 읽기 / 쓰기를 하기 때문에 속도가 빠르다는 장점이 있다.
하지만 버퍼가 가득차있는 경우나 비어있는 경우, 또 동시에 여러 프로세스가 버퍼에 꺼내기 작업을 하는 경우등, 여러 동기화에 대한 고민뿐만 아니라 버퍼를 사용해 채우고 꺼내는 것을 프로그래머가 일일히 구현해야하기 때문에 어렵다.
프로세스 하나와 하나가 통신할때는 구현 난이도가 어렵지 않지만, 통신에 참여하는 프로세스가 늘어 날수록 구현이 많이 어려워진다.
Message Passing
메시지 전송 방식은 운영체제에게 이 통신을 맡기는 방식으로, 운영체제에 전송할 데이터를 보내면 운영체제가 메시지 큐에 이를 저장해 놓았다가 타겟 프로세스로 이를 전해주는 방식이다.
운영체제가 통신에 대한 api를 제공해주므로, 구현할때 이 메시지 패싱 방식에 맞추어 구현해주면 운영체제가 이에대한 관리를 해준다. 프로그래머는 메시지를 던지기만 하면 된다.
메시지 패싱 방식에 필요한 커뮤니케이션 링크를 구현하는 방법도 여러가지인데, 직접적 방식과 간접적 방식이 있다.
직접적 방식
프로세스 A가 프로세스 B에 메시지를 전달하고 싶으면, 커널에게 직접적으로 프로세스 A가 메시지를 전달하고 이를 커널이 프로세스 B에게 직접 전달해주는 방식이다.
이 경우에는 오로지 양방향으로 두개의 프로세스가 하나의 링크를 가진다.
간접적 방식
메일박스 혹은 포트를 통해 메시지를 전달하는 방식이다.
직접방식처럼 해당 프로세스에 직접적으로 전달하는 것이 아니라, 중간 보관함(port)을 만들어 이곳에 보관하고, 이를 다른 프로세스가 접근하여 가져가는 방식이다. 특정 프로세스를 명시하지 않으므로 여러 프로세스가 중간 보관함에 접근이 가능하기 때문에 좀 더 다양한 링크를 만들 수 있어 다대다 관계의 통신관계를 만들 수 있다.
따라서 보관함을 만들고, 보내고, 받고, 보관함을 없애는 네가지의 작업에 대한 것에 대한 것만 명시해주면, 나머지는 o/s가 알아서 처리해준다.
마무리
이렇게 프로세스간 통신에 대해 알아보았다.
다음 강의에서는 프로세스가 실제로 어떻게 통신을 하고 이를 어떻게 구현하는지에 대해 알아보도록 하자.
댓글남기기