메모리 배리어(Memory Barrier)는 멀티스레드·멀티프로세서 환경에서 메모리 연산의 순서를 제어하기 위해 사용되는 하드웨어 또는 소프트웨어 명령을 의미한다. CPU가 명령을 재배열하거나 캐시 일관성 프로토콜이 자동으로 수행하는 메모리 접근의 순서를 제한함으로써, 특정 연산이 다른 연산보다 반드시 먼저 수행되도록 보장한다.
정의 및 목적
- 정의: 프로그램 코드 상에서 메모리 배리어가 삽입된 지점 이전에 발생한 모든 메모리 읽기·쓰기 연산이, 그 지점 이후에 발생하는 메모리 연산보다 먼저 전파·완료된다고 보장한다.
- 목적: 동기화 오류(예: 데이터 레이스)를 방지하고, 락·세마포어·원자 연산 등과 결합하여 올바른 동시성 제어를 구현한다.
종류
메모리 배리어는 구현 방식과 보장하는 순서에 따라 크게 다음과 같이 구분된다.
| 종류 | 보장 내용 | 대표적인 명령(예) |
|---|---|---|
| Load‑Load Barrier | 이전 로드 연산이 이후 로드 연산보다 먼저 완료됨 | lfence(x86) |
| Store‑Store Barrier | 이전 스토어 연산이 이후 스토어 연산보다 먼저 완료됨 | sfence(x86) |
| Load‑Store Barrier | 이전 로드가 이후 스토어보다 먼저 완료됨 | mfence(x86) |
| Full Barrier | 모든 종류의 이전 연산이 이후 연산보다 먼저 완료됨 | mfence(x86) 등 |
플랫폼에 따라 명령어 이름과 동작이 다를 수 있다. 예를 들어 ARM 아키텍처에서는 dmb(Data Memory Barrier), dsb(Data Synchronization Barrier), isb(Instruction Synchronization Barrier) 등이 제공된다.
사용 맥락
- 멀티스레드 프로그래밍: 락을 획득하거나 해제할 때, 원자 연산 전후에 메모리 배리어를 삽입하여 공유 변수의 일관성을 유지한다.
- 드라이버·운영체제: 하드웨어 레지스터에 대한 쓰기와 읽기 순서를 보장하기 위해 배리어를 사용한다.
- 컴파일러 최적화 방지:
volatile변수 접근이나atomic_thread_fence와 같은 표준 라이브러리 함수를 통해 배리어 효과를 명시한다.
표준화 및 언어 지원
- C11/C++11:
atomic_thread_fence(memory_order_seq_cst)등으로 메모리 배리어를 표준화하였다. - Java:
volatile키워드와java.util.concurrent패키지의 원자 클래스가 내부적으로 메모리 배리어를 사용한다. - POSIX:
pthread라이브러리의 메모리 모델에서 배리어와 동등한 동작을 제공한다.
참고 사항
- 메모리 배리어는 하드웨어마다 동작 차이가 존재하므로, 특정 아키텍처에 대한 정확한 동작을 확인하려면 해당 프로세서의 매뉴얼을 참조해야 한다.
- 불필요하게 많은 배리어를 삽입하면 성능 저하가 발생할 수 있다. 따라서 최소한의 배리어를 사용하도록 설계하는 것이 일반적이다.
See also: 메모리 모델, 원자 연산, 락, 동시성, CPU 파이프라인, 캐시 일관성 프로토콜.