Inter-Process Communication(IPC)
프로세스 간 통신이란 프로세스가 서로 데이터를 주고받는 방법, 경로 등을 의미합니다. 커널의 디자인에 따라 마이크로 커널, 나노 커널 등 통신이 많이 일어나는 디자인의 경우 IPC 방식이 성능을 크게 좌지우지할 수 있습니다.
Shared memory
- 운영체제의 도움을 받아 일부 영역의 메모리를 여러 프로세스가 동시에 접근할 수 있도록 권한을 받습니다.
- 프로세스는 공유 메모리를 읽고 쓰면서 프로세스 간 통신을 하게 됩니다.
- 같은 메모리를 사용하는 환경에서 작동하므로 메모리에 접근하여 값을 변경하면 그 즉시 변경된 값이 반영되어 다른 프로세스들이 접근 시 변경된 값을 얻을 수 있습니다.
- 처음 메모리에 여러 프로세스가 접근 권한을 부여하는 작업에서만 커널 작업이 필요하고 이후엔 커널 동작이 필요 없습니다.
동작 과정
- 공유 메모리를 사용할 프로세스들 중 하나의 프로세스가 자신이 부여받은 메모리 영역 중 일부분을 선택합니다.
- 다른 프로세스 들은 공유할 메모리의 주소를 받아 이를 자신의 메모리 영역에 붙입니다.
- 운영체제가 해당 프로세스들 간의 메모리 접근 제한을 풀어줍니다.
- 이후 프로세스들은 공유 메모리를 통해 통신하게 됩니다.
* 운영체제는 더 이상 관여할 필요 없으며 프로세스가 종료 시 메모리를 반환하면 공유 메모리 또한 같이 반환하게 됩니다.
공유 메모리 방식은 생산자-소비자 모델과 유사합니다. 하나의 프로세스가 전송할 내용, 명령 등을 공유 메모리에 담아두고 이를 다른 프로세스들이 받아서 작업하는 구조를 가집니다.
공유 메모리에는 2가지 메모리 버퍼 형태가 있습니다.
- Unbounded buffer : 메모리 버퍼의 크기에 제한이 없으며 소비자 프로세스는 새 자원이 만들어질 때까지 기다려야 하며 생산자 프로세스는 항상 새로운 자원을 만들 수 있습니다. 이때 생산자 역할의 프로세스는 공유한 메모리 자원의 크기를 지정하여 이를 함께 소비자 프로세스에 알려주어야 합니다.
- Bounded buffer : 메모리 버퍼 크기에 제한이 있으며 소비자 프로세스는 버퍼가 빈 상황이면 새로운 자원이 채워질 때까지 기다리며 생산자 프로세스는 버퍼가 꽉 차 있으면 공간이 남을 때까지 기다려야 합니다.\
코드 예시
Message passing
- 데이터가 하나의 메시지가 되어 프로세스 간 통신을 하게 됩니다.
- 충돌 위험이 없기 때문에 소량의 데이터 전송에 유리합니다.
- 명령만을 주고받는 분산 시스템, 마이크로/나노 커널 방식에 유리합니다.
- 공유 메모리 방식과 다르게 같은 환경에 있지 않아도 인터넷을 통해서 메시지를 주고받을 수 있습니다. (소켓)
- 생산자-소비자 모델의 공유 메모리 방식을 이용하면 동기화 작업이 필요 없지만 메시지 전달 방식은 동기화 작업이 필요한 경우가 많습니다. 비동기, 동기 방식에 따라 결정합니다.
Send, Receive 2가지 명령에 의해 동작합니다.
- Direct communication : send, receive 동작이 특정 프로세스를 지정하며 메시지를 직접 주고받습니다.
- Indirect communication : 프로세스들 가운데 하나의 시스템, 네트워크 등을 두고 메시지를 중재하며 동작합니다. 직접 전달 방식보다 더 유연하게 동작할 수 있으며 중재 시스템의 구현에 따라 보안성, 성능 등 다양한 처리가 가능해집니다.
메시지 전달 방식은 동기화 작업이 필요합니다. 동기방식과 비동기 방식이 있습니다.
동기(Blocking, Synchronous)
- 동기 Send : 메시지를 보내고 나면 받는 프로세스에게 메시지가 도착할 때까지 다른 작업을 할 수 없습니다.
- 동기 Receive : 메시지를 받기 전까지 해당 프로세스는 다른 작업을 하지 않고 멈춰 있어야 합니다.
비동기(Nonblocking, Asynchronous)
- 비동기 Send : 메시지를 보내고 프로세스는 멈추지 않고 다음 작업을 진행합니다.
- 비동기 Receive : 메시지를 받으면 해당 메시지가 유효한 내용인지 검사를 하고 처리를 합니다.
Socket
- Client-Server 구조에서 통신을 위한 End-Point의 의미입니다.
- 연결 특성에 따라 1:1, 1:N, N:M 프로세스들이 짝이 되며 각 프로세스들은 Socket이라는 end point를 가지고 socket에 도달한 메시지를 읽어드리는 메시지 전달 방식 인터페이스입니다.
- IP 주소와 port 번호를 통해 소켓을 구분합니다. 이를 통해 같은 컴퓨터 내의 프로세스에게 전달도 가능하며 네트워크를 이용해 다른 환경의 프로세스에 전달 또한 가능합니다.
- 네트워크 망을 통해 작성한 메시지를 IP 주소와 port 번호를 통해 경로를 찾고 전달하게 됩니다.
* 소켓은 IPC 방식이 아닌 IPC를 구현하기 위한 하나의 인터페이스이며 설계에 따라 동기, 비동기 방식 모두 가능합니다.
Pipe
- 가장 오래된 UNIX 계열 시스템의 IPC 방식이며 모든 UNIX 계열 시스템이 제공합니다.
- 두 개의 프로세스가 파일 디스크립터(FD)를 통해 메시지를 주고받는 방식입니다.
- 기본 파이프 통신은 반이중 방식이며 부모, 자식 관계의 프로세스들만 사용이 가능하다는 한계점이 있습니다.
부모 프로세스가 파이프를 생성하고 fork()를 통해 자식 프로세스를 만든 후 자식 프로세스가 부모 프로세스의 파이프를 통해 통신하게 됩니다.
* 별개의 프로세스 간 통신을 위해 Named Pipe(FIFO)가 있으며 다수의 프로세스가 이를 공유하여 통신이 가능합니다. 하지만 기존 파이프와 같이 같은 컴퓨터 환경에서만 동작이 가능합니다.
'스터디 > 운영체제' 카테고리의 다른 글
[운영체제] 좀비 프로세스, 고아 프로세스 (0) | 2021.03.15 |
---|---|
[운영체제] 프로세스 생성과 소멸 (0) | 2021.03.15 |
[운영체제] 비전섬 스케줄링 vs 선점 스케줄링 (0) | 2021.03.10 |
[운영체제] Scheduling (0) | 2021.01.22 |
[운영체제] Context Switch (0) | 2021.01.16 |