프로그래밍언어론
공유메모리와 메시지 전달의 구현 비교
plas
2022. 5. 16. 08:04
원문: Differentiate between shared memory and message passing model in OS
공유메모리 시스템 은 프로세스간 통신의 기본 모델이다. 공유메모리 시스템에서는 메모리 중 일부를 공유 메모리 영역으로 설정하고 프로세스들이 서로 데이터를 주고받게 된다.
공유메모리 개념은 프로세스 간의 가장 빠른 통신 방식이다.
어떤 프로세스가 통신을 시작하고 싶고 공유할 데이터가 있다면 자신의 메모리 어딘가에 공유메모리 영역을 설정하면 된다. 그런 다음 다른 프로세스는 그 영역의 데이터를 읽으려고 하면 스스로 그 공유영역 사용을 설정해야 한다.
메시지 전달(Message Passing) 방식은 프로세스들이 공유 영역 없이 통신하고 동기화하는 방법을 제공한다.
예를 들어 인터넷 상의 채팅 프로그램을 생각해 보자. 메시지 전달은 다음 두가지 연산을 사용한다.
- Send message
- Receive message
보내진 메시지는 고정 크기거나 가변 크기가 될 수 있다. 고정 크기 메시지라면 시스템의 구현은 비교적 쉽다. 그러나 프로그래밍하기는 더 어려울 것이다. 가변 크기 메시지는 시스템 수준에서 좀더 많은 일을 해야 하지만 프로그래밍 작업은 간편하다. 프로세스 P1과 P2가 통신을 원한다면 그들은 그들 사이에 통신 링크가 존재하는 것처럼 서로 메시지를 주소받으면서 통신하게 된다.
차이점
공유메모리 기반 | 메시지 전달 기반 |
통신할 프로세스들이 동일한 기계 상에 있거나 공유 메모리를 사용할 수 있는 환경이어야 한다. | 기존에는 분산 환경에서 프로세스들이 통신할 때 많이 쓰인다. 최근에는 Go언어에서 고루틴 통신을 위해 메시지 전달을 쓰면서 동일 기계 상의 프로세스 간 통신에도 많이 쓰인다. |
공유 메모리를 읽거나 쓰는 코드를 명시적으로 프로그래머가 작성해야 한다. | 메시지 전달 자체는 시스템에서 구현된 통신부에서 수행하게 된다. 그러나 프로그램은 메시지를 통해 통신이 잘 이루어지도록 논리적인 흐름을 구성해야 한다. |
최대 속도의 통신을 보장할 수 있다. 왜냐하면 공유 메모리를 읽고 쓰는 것이 통신이므로 이것이 잘 동작하는 환경이라면 매우 빠를 것이다. |
시스템 호출을 통해 메시지 전달이 구현되어야 하므로 시간이 걸린다. 메시지를 송수신하는데도 지연이 발생할 수 있다. |
공유메모리는 프로세스들이 동일한 주소에 동시에 쓰지 않도록 보장해야 한다. - 경쟁조건(race condition) | 메시지 전달은 큐에 의해 구현되고 메시지는 스트림으로 한번만 쓰이므로 경쟁조건은 발생하지 않는다. |
여러 개의 프로세스가 대량의 데이터에 대해 계산을 나누어한다면 계산할 데이터를 나누어 각 프로세스에게 계산을 맡긴다. (100만개의 데이터의 분산을 구한다) | 부분으로 나눈 값을 각 프로세스(합계/평균)에게 메시지로 나누어주어야 하고 계산된 결과를 다음 프로세스(분산계산)에게 전달하고 그것을 다시 취합하는 프로세스에게 메시지로 전달한다. |
동기화: 프로세스들이 공유메모리를 사용하기 위해서는 다른 프로세스가 사용중일 때는 기다려야 한다. 별도의 공유데이터를 이용해 프로세스가 준비되었는지 데이터가 사용가능한지 등을 나타내게 된다. (제어를 위한 공유데이터를 많이 사용하게 됨) | 프로세스 간에 순서가 있거나 동기화해야 하는 경우 메시지로 준비되었음을 알리거나 다음 계산을 해달라는 요청을 보내게 된다. 각 프로세스는 이러한 메시지 송수신하면서 작업을 하게 된다. 동기화(송수신이 일어나야 그 다음으로 넘어감)할 수도 있고 비동기화(보내고 다른 일 하고 받는 쪽은 오면 시스템이 알려주어 해당 처리를 하게 됨) |