Interprocess Communication
IPC란?
프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.
Communication이 필요한 이유?
모든 프로세스가 같은 정보를 공유하기 위한 경우, 계산량 증가(computation speed up), 그리고 병렬 프로세싱과 같은 경우에는 여러 개의 프로세스가 동시에 같은 프로그램을 실행하는 것이 효율적입니다.
예를 들어, write 작업을 해야 하는 경우, 한 프로세스가 작업을 하는 것보다 작업을 네 부분으로 나누어서 네 개의 프로세스가 동시에 작업하는 것이 더욱 효율적입니다. 계산 작업의 경우에도, 한 프로세스가 전체를 계산하는 것보다 각 프로세스가 자신에게 할당된 부분만 계산하는 것이 더 빠르고 효율적입니다.
모듈화(Modularity)
하나의 프로그램이 여러 개의 모듈로 나누어질 수 있으며, 이를 통해 더욱 빠른 작업 속도와 궁극적으로는 communication에 의한 협력이 가능합니다.
편의성(Convenience)
이는 사용자의 입장에서 봤을 때의 이점입니다. 사용자는 시스템에서 동시에 웹 서핑 및 프로그램 컴파일러를 실행할 수 있습니다.
Communication 메소드
공유 메모리(Shared Memory)
공유 메모리는 두 개의 프로세스가 공유할 수 있는 메모리 영역으로, 유저 공간에서 shm get 함수를 사용하여 생성할 수 있습니다.
메시지 패싱(Message Passing)
메시지 패싱은 대표적인 IPC 방법 중 하나로, 메시지 큐(message queue)가 이에 해당합니다. 메시지 큐는 Linux의 경우 msgget 함수를 사용하여 생성할 수 있으며, 이는 커널 공간에서 생성됩니다. 프로세스 A와 B 사이에는 공유되는 메모리 공간이 없으며, 메시지 큐를 통해 메시지를 주고받습니다.
Message queue와 Shared memory는 어떤 차이?
메시지 큐는 메시지를 통해 정보를 교환하며, 두 개의 프로세스 간에는 메모리 공간이 공유되지 않아도 됩니다. 따라서, 프로세스 간의 통신에 있어서 메시지 큐는 매우 유용한 IPC 방법 중 하나입니다.
*분산 시스템의 경우 -> message passing
*분산 시스템
분산 시스템은 공유하는 공동의 목표를 달성하기 위해 여러 개의 개별 컴퓨팅 노드에서 컴퓨팅 리소스를 활용하는 컴퓨터 프로그램의 모음입니다. 분산 컴퓨팅 또는 분산 데이터베이스라고도 하며, 별도의 노드가 공동의 네트워크를 통해 통신하고 동기화합니다. 이러한 노드는 일반적으로 별도의 물리적 하드웨어 장치를 나타내지만 별도의 소프트웨어 프로세스 또는 기타 반복적인 캡슐화 시스템을 나타낼 수도 있습니다. 분산 시스템은 시스템에서 병목 현상이나 중앙에 장애 지점을 제거하는 것을 목표로 합니다.
분산 컴퓨팅 시스템의 특징은 다음과 같습니다.
- 리소스 공유: 분산 시스템은 하드웨어, 소프트웨어 또는 데이터를 공유할 수 있습니다.
- 동시 처리: 여러 시스템에서 동일한 기능을 동시에 처리할 수 있습니다.
- 확장성: 컴퓨팅 및 처리 용량은 추가 시스템으로 확장할 때 필요에 따라 확장할 수 있습니다.
- 오류 감지: 장애를 더 쉽게 감지할 수 있습니다.
- 투명성: 노드는 시스템의 다른 노드에 액세스하고 통신할 수 있습니다.
출처: https://www.atlassian.com/ko/microservices/microservices-architecture/distributed-architecture
서로 다른 메모리 공간을 가진 기기들이 네트워크로 연결되어 정보를 교환하는 분산 시스템에서는 각 기기가 공유 메모리를 사용할 수 없습니다. 따라서, 예를 들어 프로세스 A와 B가 있다면 서로 공유 메모리를 사용할 수 없습니다.
이러한 경우 정보를 교환하기 위해서는 send와 receive와 같은 메시지 패싱 방식을 사용해야 합니다. 물론, remote memory를 사용하는 경우에는 공유 메모리를 사용할 수 있습니다. 그러나 이 경우를 제외하고는, 분산 시스템에서 메시지 패싱은 주요한 통신 방법 중 하나입니다.
synchronization
메시지 패싱의 경우 동기화(synchronization)가 필요하지 않습니다. 반면, 공유 메모리에서는 동기화가 필요합니다.
예를 들어, 프로세스 A와 B가 같은 메모리 공간을 공유하고 있다고 가정해보겠습니다. 그러면 다음과 같은 상황이 발생할 수 있습니다.
1. A가 데이터를 쓴다
2. write가 완료되지 않은 시점에 B가 read를 시도
예를 들어, 프로세스 A가 데이터를 쓰는 도중에 아직 쓰기가 완료되지 않은 상태에서 프로세스 B가 데이터를 읽으려고 한다면, 이를 위해서는 A가 데이터를 모두 쓸 때까지 B가 대기해야 합니다. 또한, B가 데이터를 읽는 도중에 A가 데이터를 수정하려 할 수 있는데 이 경우에는 A가 대기해야 합니다.
이러한 동기화를 위해서 semaphore와 같은 동기화 메커니즘이 사용됩니다. 하지만, 메시지 패싱에서는 이러한 동기화가 필요하지 않습니다.
메시지 패싱에서는 send와 receive를 사용하여 데이터를 전송하면 됩니다. 또한, 필요한 동기화는 운영체제에서 처리됩니다. 이로 인해 사용자는 동기화를 신경쓰지 않아도 됩니다. 따라서, 메시지 패싱은 동기화 관련 문제를 해결하기 위해 별도의 동기화 메커니즘이 필요하지 않습니다.
data를 주고 받을 때
메시지를 보낼 때마다 send와 receive를 해 주어야 한다는 것은, 메시지 패싱에서는 메시지 전송을 위해 매번 OS에 서비스 요청(system call)을 해야 한다는 것을 의미합니다.
반면에 shared memory의 경우, shmget()을 호출하여 shared memory 공간을 하나 만들고, 이를 이용하여 각각의 프로세스가 데이터를 쓰고 읽을 수 있습니다. 이 과정에서 kernel의 간섭 없이 데이터를 쓸 수 있으며, 따로 system call을 호출하지 않아도 됩니다.
memory 전달 속도
메모리 전달 속도는 shared memory가 system call을 필요로 하지 않기 때문에 더 빠릅니다. 반면, message passing은 system call을 호출하면서 kernel에서 처리되기 때문에 상대적으로 느릴 수 있습니다
다음 글.
2022.08.12 - [운영체제] - RPC_Remote Procedure Calls
'운영체제' 카테고리의 다른 글
File System(1) (0) | 2022.08.27 |
---|---|
RPC_Remote Procedure Calls (0) | 2022.08.12 |
CPU Scheduling이 필요한 경우와 고려해야할 것들 (0) | 2022.07.29 |
Process Scheduling (0) | 2022.07.29 |