공유 메모리와 분산 공유 메모리(DSM)란?
공유 메모리(Shared Memory)는 둘 이상의 프로그램이 동시에 접근할 수 있는 메모리 블록을 의미합니다. 공유 메모리 개념은 프로그램 간 통신 수단을 제공하고, 불필요하게 중복되는 메모리 관리를 줄여 효율성을 높이는 데 활용됩니다.
분산 공유 메모리(Distributed Shared Memory, DSM)는 이러한 공유 메모리 개념을 분산 시스템 환경에서 구현한 기술입니다. DSM 시스템은 로컬 물리적 공유 메모리가 없는 느슨하게 결합된(loosely coupled) 시스템에서도 공유 메모리 모델을 구현할 수 있도록 합니다. 즉, 분산 계층 구조를 이루는 모든 시스템(일명 노드(node))이 접근할 수 있는 가상의 공유 메모리 공간을 제공합니다.
DSM 구현 시 직면하는 주요 과제
DSM을 실제로 구현할 때에는 다음과 같은 문제들을 반드시 고려해야 합니다.
- 공유 메모리에 원격으로 저장된 데이터의 메모리 주소(위치)를 추적하는 방법
- 원격 데이터 참조 시 발생하는 통신 지연과 높은 오버헤드를 최소화하는 방법
- DSM에서 공유되는 데이터에 대한 동시 접근(concurrent access)을 제어하는 방법
이러한 과제를 해결하기 위해 다양한 알고리즘이 설계되었으며, 대표적으로 다음 네 가지 알고리즘이 사용됩니다.
- 중앙 서버 알고리즘(Central Server Algorithm)
- 마이그레이션 알고리즘(Migration Algorithm)
- 읽기 복제 알고리즘(Read Replication Algorithm)
- 전체 복제 알고리즘(Full Replication Algorithm)
1. 중앙 서버 알고리즘(Central Server Algorithm)
중앙 서버 알고리즘은 모든 공유 데이터를 중앙 서버가 단독으로 관리하는 방식입니다. 분산 시스템의 다른 노드들은 서버에 데이터 읽기 및 쓰기를 요청하며, 서버는 해당 요청을 처리해 데이터에 대한 접근 권한을 부여하거나 갱신된 결과를 확인 응답(acknowledgment) 메시지와 함께 반환합니다.
이 확인 응답 메시지는 요청한 데이터 작업이 정상적으로 처리되었음을 알려주는 상태 정보 역할을 합니다. 데이터를 호출한 쪽에 전달될 때에는 데이터 접근 순서를 나타내는 일련번호가 함께 전송되어 동시성(concurrency)을 유지하며, 요청 실패 시에는 타임아웃(time-out)이 반환됩니다.
규모가 큰 분산 시스템에서는 하나의 서버로 감당하기 어려울 수 있습니다. 이 경우 여러 대의 서버를 두고, 각 노드는 서버의 주소나 매핑 함수(mapping function)를 통해 적절한 서버의 위치를 찾아 요청을 보냅니다.
이 알고리즘은 구조가 단순하고 일관성 관리가 용이하다는 장점이 있지만, 모든 요청이 중앙 서버에 집중되므로 서버에 장애가 발생하면 전체 시스템이 마비되는 단일 실패점(Single Point of Failure) 문제와 병목 현상이 발생할 수 있다는 점을 유의해야 합니다.
2. 마이그레이션 알고리즘(Migration Algorithm)
마이그레이션 알고리즘은 이름 그대로 데이터 요소 자체를 이동(migration)시키는 방식입니다. 중앙 서버가 모든 요청을 대신 처리하는 대신, 특정 시스템이 데이터를 요청하면 해당 데이터를 포함한 블록 전체가 요청한 노드로 이동하여 이후의 접근과 처리가 로컬에서 이루어집니다.
이 알고리즘은 한 시스템이 동일한 데이터 블록에 반복적으로 접근하는 경우에 특히 효과적이며, 가상 메모리(virtual memory) 개념과의 통합도 가능하다는 장점이 있습니다.
다만 몇 가지 단점도 존재합니다. 첫째, 한 번에 오직 하나의 노드만 공유 데이터 요소에 접근할 수 있으며, 접근 권한을 얻으면 데이터 블록 전체가 해당 노드로 이동합니다. 둘째, 노드의 요청에 따라 데이터가 빈번하게 이동하기 때문에 스래싱(thrashing), 즉 데이터가 노드 사이를 끊임없이 오가며 시스템 성능이 급격히 저하되는 현상이 발생하기 쉽습니다.
3. 읽기 복제 알고리즘(Read Replication Algorithm)
읽기 복제 알고리즘에서는 접근 대상이 되는 데이터 블록이 여러 노드에 복제(replication)되며, 모든 복제본에서는 읽기 연산만 허용됩니다. 쓰기 연산이 필요한 경우에는 모든 복제본의 갱신이 완료될 때까지 모든 읽기 접근이 일시적으로 중단됩니다.
복수의 노드가 동시에 데이터를 읽을 수 있으므로 동시 접근이 허용되어 전체적인 시스템 성능이 향상됩니다. 그러나 일관성(concurrency)을 유지하려면 공유되는 모든 블록을 갱신해야 하므로 쓰기 연산의 비용이 크게 증가합니다. 또한 데이터 일관성을 보장하기 위해 모든 복제본의 위치와 상태를 지속적으로 추적·관리해야 하는 부담도 따릅니다.
따라서 이 알고리즘은 읽기 작업의 비중이 쓰기 작업보다 훨씬 많은 애플리케이션 환경에서 특히 유리합니다.
4. 전체 복제 알고리즘(Full Replication Algorithm)
전체 복제 알고리즘은 읽기 복제 알고리즘을 확장한 형태로, 모든 노드가 공유 데이터 블록에 대해 읽기와 쓰기 연산을 동시에 수행할 수 있도록 허용합니다. 물론 데이터 일관성을 유지하기 위해 노드들의 접근은 엄격하게 제어됩니다.
동시 접근 상황에서 데이터 일관성을 보장하기 위해 접근 순서(sequence)가 관리되며, 데이터가 수정될 때마다 해당 변경 내역이 멀티캐스트(multicast) 방식으로 전파되어 모든 데이터 복제본에 즉시 반영됩니다.
이 방식은 읽기와 쓰기 모두에서 높은 병렬성을 제공하지만, 모든 변경 사항을 모든 복제본에 전파해야 하므로 네트워크 통신량이 많아지고 일관성 유지 메커니즘이 복잡해진다는 점을 고려해야 합니다.
마무리: 알고리즘 선택 기준
네 가지 DSM 구현 알고리즘은 각각의 장단점이 뚜렷합니다. 중앙 서버 알고리즘은 구현이 단순하지만 확장성에 한계가 있고, 마이그레이션 알고리즘은 반복 접근에 유리하지만 스래싱 위험이 있습니다. 읽기 복제 알고리즘은 읽기 위주의 워크로드에 적합하고, 전체 복제 알고리즘은 최고 수준의 병렬성을 제공하는 대신 통신 오버헤드가 큽니다. 따라서 시스템의 규모, 워크로드의 읽기/쓰기 비율, 일관성 요구 수준을 종합적으로 고려하여 적절한 알고리즘을 선택하는 것이 중요합니다.