메모리 배리어(memory barrier)는 중앙 처리 장치(CPU)나 컴파일러에게 특정 메모리 연산의 순서를 강제하도록 하는 기능이다. "메모리 펜스(memory fence)", "펜스 명령(fence instruction)", "멤바(membar)"라고도 불린다.
컴퓨터 시스템에서 CPU는 비순차적 명령어 처리(out-of-order execution) 기법을 통해 연산 결과에 영향이 가지 않는 범위 내에서 명령어 실행 순서를 뒤바꿀 수 있으며, 컴파일러 역시 성능 최적화를 위해 유사한 명령어 재배열(reordering)을 수행한다. 단일 스레드 환경에서는 이러한 재배열이 프로그램의 최종 결과에 영향을 미치지 않지만, 여러 스레드가 동시에 메모리를 공유하며 접근하는 멀티스레드 환경에서는 명령어의 실행 순서가 변경되는 동안 다른 스레드가 해당 메모리에 접근하여 의도하지 않은 결과를 초래할 수 있다. 메모리 배리어는 이와 같은 상황에서 특정 지점을 기준으로 메모리 연산의 순서가 뒤바뀌지 않도록 강제하는 역할을 한다.
메모리 배리어는 배리어 명령 이전에 발행된 메모리 연산과 이후에 발행된 메모리 연산 사이에 순서 제약(ordering constraint)을 부과한다. 이를 통해 배리어 이전의 읽기/쓰기 연산이 완료되고 그 효과가 관찰 가능한 상태가 된 이후에야 배리어 이후의 메모리 연산이 진행되도록 보장한다.
메모리 배리어는 종류에 따라 구분된다. 전체 배리어(full fence)는 배리어 전후의 모든 읽기와 쓰기 연산에 순서를 강제한다. 그 외에도 읽기 연산에만 적용되는 배리어, 쓰기 연산에만 적용되는 배리어, 특정 아키텍처에서 정의되는 획득(acquire) 및 해제(release) 의미론과 결합된 배리어 등이 존재한다.
하드웨어 차원에서 x86 및 x86-64 아키텍처에서는 SFENCE, LFENCE, MFENCE 등의 명령어가 메모리 배리어 기능을 제공한다. SFENCE는 쓰기 연산의 순서를, LFENCE는 읽기 연산의 순서를 강제하며, MFENCE는 읽기와 쓰기 모두에 적용되는 전체 배리어이다. 한편 ARM 및 RISC-V 등 다른 아키텍처에서는 각각의 명령어 집합에 맞는 배리어 명령이 정의되어 있으며, 이들 간에는 메모리 모델의 차이로 인해 재배열 허용 범위에 차이가 있다.
메모리 배리어는 리눅스 커널을 비롯한 저수준 시스템 프로그래밍, 락-프리(lock-free) 동기화 알고리즘, 장치 드라이버 개발 등에서 널리 사용된다. 리눅스 커널은 메모리 배리어를 추상화한 mb(), rmb(), wmb() 및 SMP 환경용 smp_mb(), smp_rmb(), smp_wmb() 등의 매크로를 제공한다.
메모리 배리어는 정식 컴퓨터 과학 및 컴퓨터 공학 분야의 개념으로, 운영체제, 컴퓨터 구조, 병행 프로그래밍 관련 문헌과 표준 문서에 폭넓게 기술되어 있다.