다중 프로세서 아키텍처와 캐시 일관성 이해

다중 프로세서의 공유·분산 메모리 구조, ASMP와 SMP, 동기화와 캐시 일관성, NUMA 성능 고려사항을 정리합니다.

2026-08-14 · 최초 발행 2025-12-28

하나의 시스템에서 프로세서를 함께 쓰는 방식

다중 프로세서 시스템은 여러 프로세서를 하나의 시스템에 통합해 작업을 병렬로 처리하는 아키텍처다. 단일 프로세서의 클록 속도만 높이는 방식에는 한계가 있어, 프로세서 간 역할 분담과 메모리 접근 구조가 시스템 성능을 좌우하게 된다.

설계에서 먼저 구분할 지점은 메모리를 공유하는지, 각 프로세서가 로컬 메모리를 갖는지다. 이 선택은 통신 방식, 확장성, 동기화 비용으로 이어진다.

메모리 구조가 통신 방식과 확장성을 결정한다

공유 메모리 아키텍처에서는 모든 프로세서가 하나의 메모리 공간을 사용한다. 통일된 주소 공간을 제공하므로 프로세서 간 데이터 교환은 메모리 읽기와 쓰기로 처리할 수 있다. 다만 프로세서가 늘어날수록 공유 자원 경합이 발생해 확장성이 제한될 수 있다.

UMA(Uniform Memory Access)는 모든 프로세서의 메모리 접근 시간이 같은 구조다. 주로 버스 기반 구조에서 사용되며, 프로세서 수가 증가하면 버스 경합이 생긴다.

공유 메모리 시스템CPU 1시스템 버스CPU 2CPU 3CPU 4공유 메모리

분산 메모리 아키텍처에서는 각 프로세서가 독립적인 로컬 메모리를 보유한다. 프로세서 사이의 통신은 명시적인 메시지 전달(Message Passing)로 수행하며, 높은 확장성을 제공한다.

NUMA(Non-Uniform Memory Access) 구조에서는 로컬 메모리에 접근하는 편이 원격 메모리에 접근하는 것보다 빠르다. 따라서 상호연결망(Interconnection Network)이 필요하고, 메모리 지역성(Locality)을 최적화해야 한다.

분산 메모리 시스템노드 4노드 3노드 2노드 1CPU 4CPU 1메모리 1CPU 2메모리 2CPU 3메모리 3메모리 4상호연결망

ASMP와 SMP는 프로세서의 권한을 다르게 배분한다

ASMP(Asymmetric Multi-Processing)는 마스터-슬레이브 구조를 사용하는 비대칭 다중 처리 방식이다. 하나의 마스터 프로세서가 시스템 전체를 제어하고, 나머지 프로세서는 정해진 작업을 수행한다. OS는 마스터 프로세서에서만 실행된다.

이 방식은 구현이 비교적 단순하고 레거시 시스템과의 호환성이 좋다. 반면 작업 분배가 불균등해질 수 있으며, 마스터 프로세서가 병목이 되면 프로세서 활용률과 확장성이 떨어질 수 있다.

SMP(Symmetric Multi-Processing)는 모든 프로세서가 동등한 역할을 맡는 대칭 다중 처리 방식이다. 각 프로세서가 OS 커널을 실행할 수 있고, 공유 메모리를 통해 통신하면서 작업 부하를 균등하게 분배한다. 현대 서버와 데스크톱에서 표준적으로 사용되는 아키텍처다.

동적 부하 분산과 높은 프로세서 활용률을 기대할 수 있지만, 동기화 메커니즘과 캐시 일관성 유지에 따른 오버헤드가 필요하다. 구현 복잡도도 높아진다.

SMP 구조CPU 1(OS 실행)공유 메모리CPU 2(OS 실행)CPU 3(OS 실행)ASMP 구조제어제어마스터 CPU(OS 실행)슬레이브 CPU 1슬레이브 CPU 2공유 메모리

공유 자원에는 중재와 동기화가 필요하다

공유 버스나 메모리처럼 여러 프로세서가 함께 접근하는 자원은 접근 순서를 조정해야 한다. 중앙 집중식 중재(Centralized Arbitration)는 단일 중재기(Arbiter)가 모든 요청을 처리하므로 구현은 단순하지만 확장성에 제약이 있다. 분산 중재(Distributed Arbitration)는 각 프로세서가 독립적으로 중재하므로 확장성은 높지만 복잡한 프로토콜이 필요하다.

중재 알고리즘으로는 고정 우선순위(Fixed Priority), 라운드 로빈(Round Robin), TDMA(Time Division Multiple Access)를 사용할 수 있다.

프로세서 간 통신은 크게 두 형태다. 공유 메모리 기반 통신은 메모리 읽기와 쓰기로 데이터를 교환하므로 빠르지만 동기화가 복잡하다. 메시지 전달 기반 통신은 명시적인 send/receive 연산을 사용하며 통신 의미론이 분명하고, 분산 메모리 시스템에 적합하다.

동기화에서는 임계 구역(Critical Section)을 보호하는 상호 배제가 기본이다. 스핀락(Spinlock)과 뮤텍스(Mutex)가 여기에 사용된다. 배리어(Barrier)는 모든 프로세서가 특정 지점에 도달할 때까지 대기시켜 병렬 알고리즘의 단계별 동기화를 지원한다. Test-and-Set, Compare-and-Swap 같은 원자적 연산(Atomic Operations)은 하드웨어 수준에서 지원되며 Lock-free 알고리즘의 기초가 된다.

메모리CPU 2공유 버스CPU 1메모리CPU 2공유 버스CPU 1버스 요청버스 승인데이터 쓰기완료버스 해제버스 요청버스 승인데이터 읽기데이터 반환버스 해제

캐시 복사본이 어긋나는 상황을 다루는 법

각 프로세서가 독립적인 캐시를 보유하면, 같은 메모리 위치의 복사본이 여러 캐시에 존재할 수 있다. 이때 한 프로세서의 쓰기 연산이 다른 프로세서에 즉시 보이지 않으면 데이터 불일치(Inconsistency)가 발생한다. 캐시 일관성은 이 문제를 관리하는 장치다.

Snooping 기반 프로토콜에서는 캐시가 공유 매체의 트랜잭션을 감시한다. MSI 프로토콜은 Modified, Shared, Invalid 상태를 사용한다. Modified는 수정되어 캐시에만 존재하는 상태이고, Shared는 공유된 읽기 전용 상태이며, Invalid는 사용할 수 없는 상태다.

MESI 프로토콜은 Exclusive 상태를 추가한다. 이는 독점적 읽기 전용 상태로, 쓰기 시 브로드캐스트가 필요하지 않다. MOESI 프로토콜은 Owned 상태를 추가해 수정된 데이터를 공유할 수 있게 한다.

Directory 기반 프로토콜은 중앙 디렉토리가 캐시 상태를 추적한다. 브로드캐스트 대신 포인트-투-포인트 통신을 사용하므로 대규모 시스템에 적합하지만, 디렉토리 오버헤드가 존재한다.

쓰기 정책도 일관성 트래픽에 영향을 준다. Write-Invalidate는 쓰기 시 다른 캐시의 복사본을 무효화하며 단일 쓰기에 효율적이다. Write-Update(Write-Broadcast)는 쓰기 시 모든 캐시의 복사본을 갱신하므로 빈번한 읽기에 효율적이다.

False Sharing은 서로 다른 변수가 같은 캐시 라인에 배치되어 불필요한 일관성 트래픽이 발생하는 문제다. 데이터 배치를 최적화해 해결할 수 있다.

읽기 미스독점 읽기쓰기다른 CPU 읽기다른 CPU 쓰기쓰기다른 CPU 쓰기다른 CPU 읽기InvalidSharedExclusiveModified수정됨메모리와 불일치독점메모리와 일치공유읽기 전용무효사용 불가

병렬 처리 성능은 메모리 접근까지 포함해 판단한다

Amdahl의 법칙에서는 직렬로 남는 부분이 전체 성능을 제한한다. 병렬화 가능한 부분의 비율뿐 아니라, 동기화에 드는 오버헤드도 함께 고려해야 한다.

프로세서 수가 증가하면 메모리 경합도 심해진다. 캐시 계층 구조를 최적화하고 메모리 인터리빙(Interleaving)을 활용하는 이유다.

NUMA 환경에서는 프로세스나 스레드를 특정 노드에 배치하는 Affinity 설정으로 로컬 메모리 접근을 최대화할 수 있다. First-Touch 정책도 이 최적화에 활용된다.

다중 프로세서 설계에서는 메모리 구조, 프로세서의 역할 분담, 공유 자원의 중재, 캐시 일관성, 메모리 지역성을 분리해 볼 수 없다. 이 요소들이 함께 맞물려 병렬 시스템의 정확성과 성능을 결정한다.

다중 프로세서공유 메모리SMP캐시 일관성NUMA