하나의 컴퓨터에 프로세서가 여러 개 존재하면, 이 프로세서들이 메모리에 접근하는 방식을 어떻게 설계할 것인가라는 근본적인 질문이 생깁니다. 가장 직관적인 답은 "모든 프로세서가 하나의 메모리를 동등하게 공유한다"입니다. 이것이 바로 UMA(Unified Memory Access, 균일 메모리 접근) 아키텍처의 핵심 아이디어입니다. UMA는 멀티프로세서 시스템의 출발점이자 오랫동안 주류였던 메모리 접근 모델이지만, 프로세서 수가 늘어나면서 구조적 한계에 부딪혀 NUMA로의 전환을 촉발했습니다. 이 글에서는 UMA의 구조, 동작 원리, SMP(Symmetric Multiprocessing)와의 관계, 그리고 확장성 한계까지 살펴봅니다.
UMA란 무엇인가
UMA(Unified Memory Access)는 멀티프로세서 시스템에서 모든 프로세서가 공유 메모리에 균일한 지연 시간으로 접근하는 메모리 아키텍처를 말한다. 어떤 프로세서가 어떤 메모리 주소에 접근하든, 접근 지연은 동일하다.
여기서 는 프로세서 집합, 는 메모리 주소 공간, 는 프로세서 가 주소 에 접근하는 데 걸리는 시간이다. 이 균일성이 UMA의 이름이 된 핵심 성질이며, 프로그래머가 메모리 위치를 의식하지 않고 코드를 작성할 수 있게 하는 근거이기도 하다.
하드웨어 구조
UMA 시스템의 물리적 구조는 단순하다. 여러 프로세서가 공유 버스(shared bus) 또는 크로스바 스위치(crossbar switch)를 통해 하나의 메인 메모리에 연결된다.
공유 버스 모델
가장 전통적인 UMA 구현은 공유 버스 모델이다. 모든 프로세서가 하나의 시스템 버스에 연결되고, 이 버스를 통해 메모리와 I/O에 접근한다. 버스 중재기bus arbiter1가 한 시점에 하나의 프로세서만 버스를 사용하도록 조율한다.
이 모델은 하드웨어가 단순하고 비용이 낮다는 장점이 있지만, 버스가 단일 공유 자원이라는 점에서 근본적인 확장성 제약을 갖는다. 프로세서 수가 증가하면 버스 대역폭을 놓고 경쟁이 심화되어, 특정 임계점을 넘으면 프로세서를 추가해도 성능이 향상되지 않는다.
크로스바 스위치 모델
크로스바 스위치crossbar switch2는 개의 프로세서와 개의 메모리 모듈 사이에 격자 형태의 스위치를 배치하여, 서로 다른 메모리 모듈에 접근하는 프로세서들이 동시에 통신할 수 있도록 한다. 버스 모델의 대역폭 병목을 해소하지만, 스위치 수가 으로 증가하므로 프로세서가 많아지면 비용이 급격히 상승한다.
멀티포트 메모리 모델
메모리 자체에 여러 접근 포트를 두어 여러 프로세서가 동시에 접근할 수 있도록 하는 방식이다. 하드웨어 복잡도가 높아 대규모 시스템에서는 잘 사용되지 않는다.
UMA와 SMP의 관계
UMA라는 용어는 메모리 접근 패턴의 균일성을 가리키고, SMP(Symmetric Multiprocessing)는 프로세서의 역할 대칭성을 가리킨다. 실질적으로 모든 SMP 시스템은 UMA 아키텍처를 채택하며, 대부분의 문맥에서 두 용어는 사실상 동의어로 취급된다.
SMP의 "대칭"이란 모든 프로세서가 운영체제, 메모리, I/O에 대해 동등한 권한과 접근 능력을 가진다는 의미다. 특정 프로세서만 운영체제를 실행하거나 I/O를 처리하는 비대칭 멀티프로세싱(AMP, Asymmetric Multiprocessing)3과 대조된다.
SMP/UMA 시스템에서 운영체제는 어떤 프로세서에서든 실행될 수 있고, 스케줄러는 모든 프로세서에 동등하게 태스크를 분배한다. 이 대칭성 덕분에 프로그래머와 운영체제 입장에서는 프로세서 간 차이를 신경 쓸 필요가 없다.
캐시 일관성 문제
UMA 시스템에서 각 프로세서는 성능을 위해 자체 캐시(L1, L2)를 갖는다. 그런데 여러 프로세서가 같은 메모리 주소를 자신의 캐시에 복사해 두면, 한 프로세서가 해당 주소를 수정했을 때 다른 프로세서의 캐시에는 오래된 값이 남게 된다. 이것이 캐시 일관성(cache coherence) 문제다.
스누핑 프로토콜
공유 버스 기반 UMA에서 가장 널리 사용되는 캐시 일관성 해법은 스누핑snooping 프로토콜이다. 모든 캐시 컨트롤러가 버스 트래픽을 감시(snoop)하면서, 자신이 보유한 캐시 라인에 대한 다른 프로세서의 쓰기나 읽기를 감지하고 적절히 대응한다.
대표적인 스누핑 프로토콜로는 MESI(Modified-Exclusive-Shared-Invalid)4 프로토콜이 있으며, 각 캐시 라인의 상태를 네 가지로 관리한다.
| 상태 | 의미 |
|---|---|
| Modified (M) | 이 캐시만 최신 값을 보유, 메모리보다 새로움, 쓰기 가능 |
| Exclusive (E) | 이 캐시만 보유, 메모리와 일치, 쓰기 시 M으로 전환 |
| Shared (S) | 여러 캐시가 보유, 메모리와 일치, 읽기만 가능 |
| Invalid (I) | 유효하지 않은 캐시 라인 |
스누핑이 동작하려면 모든 메모리 트랜잭션이 공유 매체(버스)를 통과해야 한다. 공유 버스가 자연스럽게 브로드캐스트 채널 역할을 수행하기 때문에, 스누핑 프로토콜은 버스 기반 UMA에 특히 적합하다.
스누핑의 확장성 한계
스누핑 프로토콜은 버스 대역폭에 의존한다. 프로세서 수가 늘어나면 일관성 트래픽도 비례하여 증가하고, 이 트래픽이 실제 데이터 전송에 사용할 수 있는 버스 대역폭을 잠식한다. 경험적으로 공유 버스 기반 UMA 시스템은 8~16개 프로세서를 넘기면 버스 포화가 시작되어 프로세서 추가의 효용이 급감한다(Culler, Singh and Gupta, 1999).
확장성의 벽
UMA의 확장성 한계는 공유 버스의 대역폭이라는 단일 자원에서 비롯된다. 프로세서 수가 일 때, 각 프로세서가 캐시 미스 시 생성하는 메모리 트래픽을 라 하면, 총 버스 트래픽은 대략 에 비례한다. 버스의 최대 대역폭 를 초과하면 프로세서들이 버스 대기에 시간을 소비하게 되어 유효 처리량이 정체된다.
이 비율이 1에 가까워지면 버스가 포화 상태에 이르러, 추가 프로세서는 실질적 성능 향상 없이 전력과 비용만 소모한다.
이 구조적 한계를 돌파하기 위해 등장한 것이 NUMA 아키텍처다. NUMA는 메모리를 프로세서에 가까운 로컬 노드 단위로 분산 배치하여, 로컬 접근은 빠르고 원격 접근은 느린 불균일한 지연을 허용하는 대신 대역폭 병목을 해소한다.
UMA가 여전히 사용되는 곳
UMA가 확장성 한계를 가진다고 해서 사라진 것은 아니다. 프로세서 수가 적은 환경에서는 UMA의 단순성이 여전히 강점이다.
오늘날의 데스크톱과 노트북에 탑재되는 멀티코어 프로세서는 사실상 하나의 다이 위에 여러 코어가 집적된 UMA 시스템이다. 모든 코어가 통합 메모리 컨트롤러를 거쳐 동일한 DRAM에 균일하게 접근한다. Apple Silicon(M1~M4) 계열의 통합 메모리Unified Memory 아키텍처는 CPU와 GPU가 동일한 물리 메모리를 공유하는 UMA의 현대적 구현이다5.
임베디드 시스템과 실시간 시스템에서도 메모리 접근 지연의 예측 가능성이 중요하기 때문에, 균일한 접근 지연을 보장하는 UMA가 선호된다.
서버 시장에서는 2소켓 이하의 소규모 구성이라면 UMA의 프로그래밍 단순성이 NUMA의 최적화 복잡성보다 유리할 수 있다. 다만 현대의 2소켓 서버도 물리적으로는 NUMA 토폴로지를 갖추고 있으며, BIOS 설정에서 노드 인터리빙node interleaving을 활성화하면 하드웨어가 메모리 주소를 라운드 로빈으로 분산하여 소프트웨어 관점에서 UMA처럼 동작하게 할 수 있다.
UMA vs. NUMA: 설계 관점의 비교
| 특성 | UMA | NUMA |
|---|---|---|
| 메모리 접근 지연 | 균일 | 불균일 (로컬 < 원격) |
| 대표 연결 방식 | 공유 버스, 크로스바 | 포인트-투-포인트 인터커넥트 (QPI, UPI, Infinity Fabric) |
| 캐시 일관성 | 스누핑 (버스 브로드캐스트) | 디렉터리 기반 (포인트-투-포인트) |
| 확장성 | 8~16 프로세서 | 수백~수천 프로세서 |
| 프로그래밍 복잡도 | 낮음 (메모리 위치 무관) | 높음 (데이터 배치 최적화 필요) |
| OS 지원 | 단순 | numactl, 메모리 정책, CPU 어피니티 등 추가 지원 필요 |
프로그래머 입장에서 UMA의 최대 장점은 메모리 위치를 의식하지 않아도 된다는 것이다. NUMA에서는 데이터가 어느 노드에 할당되었는지에 따라 성능이 크게 달라지므로, numactl이나 mbind() 같은 도구로 메모리 배치를 명시적으로 제어해야 한다.
출처
- Hennessy, J. L. and Patterson, D. A. (2019) Computer Architecture: A Quantitative Approach. 6th ed. Cambridge, MA: Morgan Kaufmann. Chapters 5–6.
- Silberschatz, A., Galvin, P. B., and Gagne, G. (2018) Operating System Concepts. 10th ed. Hoboken, NJ: Wiley. §1.3.2, §6.
- Culler, D. E., Singh, J. P., and Gupta, A. (1999) Parallel Computer Architecture: A Hardware/Software Approach. San Francisco, CA: Morgan Kaufmann.
- Stallings, W. (2018) Operating Systems: Internals and Design Principles. 9th ed. Hoboken, NJ: Pearson.
- Drepper, U. (2007) "What Every Programmer Should Know About Memory." Red Hat, Inc.
Footnotes
-
버스 중재기bus arbiter는 여러 버스 마스터가 동시에 버스 사용을 요청할 때 우선순위나 라운드 로빈 방식으로 한 번에 하나의 마스터만 버스를 점유하도록 조율하는 하드웨어 로직이다. ↩
-
크로스바 스위치crossbar switch는 개의 입력과 개의 출력 사이에 개의 교차점 스위치를 배치하여, 서로 다른 출력을 향하는 입력들은 동시에 통신할 수 있도록 하는 비블로킹(non-blocking) 상호 연결 네트워크다. 전화 교환기에서 유래하였으며, 소규모 공유 메모리 멀티프로세서에서 버스의 대안으로 사용된다. — Hennessy and Patterson (2019), §5.2. ↩
-
비대칭 멀티프로세싱(AMP)은 특정 프로세서에 운영체제 커널을 전담시키고 나머지 프로세서는 사용자 태스크만 실행하는 구조다. 초기 멀티프로세서 시스템(예: SunOS 2.0 이전의 Sun 워크스테이션)에서 사용되었으나, 마스터 프로세서가 병목이 되는 문제 때문에 SMP로 대체되었다. ↩
-
MESI 프로토콜은 Illinois 대학교에서 개발된 쓰기 무효화(write-invalidate) 기반 캐시 일관성 프로토콜이다. 각 캐시 라인을 Modified, Exclusive, Shared, Invalid 네 상태로 관리하며, Intel x86 프로세서의 캐시 일관성 메커니즘의 기반이 되었다. MOESI(AMD), MESIF(Intel)는 MESI의 확장이다. — Culler, Singh and Gupta (1999), §5.3. ↩
-
Apple Silicon의 Unified Memory Architecture는 CPU, GPU, Neural Engine이 동일한 LPDDR 메모리 풀을 공유하여 데이터 복사 오버헤드를 제거한다. 전통적인 PC 아키텍처에서 CPU(시스템 메모리)와 GPU(VRAM) 간 PCIe를 통한 데이터 전송이 필요했던 것과 대비된다. ↩