메모리 오더링(memory ordering) 또는 메모리 순서는 CPU가 컴퓨터 메모리에 접근하는 순서를 나타내는 컴퓨터 과학 개념이다. 이 용어는 컴파일 타임 동안 컴파일러에 의해 생성된 메모리 순서와 런타임 중에 CPU에 의해 생성된 메모리 순서를 모두 가리킬 수 있다.
최신 마이크로프로세서에서 메모리 오더링은 메모리 작업의 순서를 변경하는 CPU의 기능을 특징으로 한다. 이는 일종의 비순차적 실행(out-of-order execution)에 해당한다. 메모리 재정렬을 사용하면 캐시 및 메모리 뱅크와 같은 다양한 유형의 메모리의 버스 대역폭을 보다 완전하게 활용할 수 있다.
대부분의 최신 단일 프로세서에서 메모리 작업은 프로그램 코드에 지정된 순서대로 실행되지 않는다. 단일 스레드 프로그램에서는 모든 작업이 지정된 순서대로 실행된 것처럼 보이며, 잘못된 실행은 프로그래머에게 숨겨진다. 그러나 다중 스레드 환경에서, 또는 메모리 버스를 통해 다른 하드웨어와 인터페이스할 때에는 메모리 접근 순서의 변경으로 인해 문제가 발생할 수 있으며, 이를 방지하기 위해 메모리 배리어(memory barrier)가 사용될 수 있다.
메모리 오더링은 하드웨어 차원과 소프트웨어 차원으로 구분하여 이해할 수 있다. 하드웨어 차원에서는 CPU와 메모리 컨트롤러가 실제 물리적 메모리 접근을 어떤 순서로 수행하는지에 대한 규칙을 의미한다. 예를 들어 x86 아키텍처는 비교적 강한 순서(strong ordering)를 제공하는 반면, ARM 및 POWER 아키텍처는 보다 느슨한 순서(weak ordering)를 허용한다. 소프트웨어 차원에서는 프로그래밍 언어와 컴파일러가 제공하는 메모리 모델에 따라 개발자가 메모리 접근 순서를 제어할 수 있는 수단을 의미한다.
프로그래밍 언어 차원에서 C++11 이후의 표준은 std::atomic과 메모리 순서(memory order) 지정자를 제공한다. 대표적인 메모리 순서로는 memory_order_relaxed, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst 등이 있으며, 이들은 각각 서로 다른 수준의 순서 보장을 제공한다. 이와 유사한 개념은 Rust, Java, Go 등 다른 프로그래밍 언어의 동시성 모델에서도 나타난다.
메모리 오더링은 메모리 일관성 모델(memory consistency model)과 밀접하게 관련되어 있다. 일관성 모델은 다중 스레드 프로그램이 공유 메모리를 사용할 때 허용되는 동작의 집합을 정의하며, 프로그래머와 시스템 간의 계약으로 기능한다. 시스템은 프로그래머가 메모리 연산에 대한 규칙을 따르는 경우 메모리가 일관성을 유지하고 읽기·쓰기·갱신 결과가 예측 가능함을 보장한다.
메모리 오더링의 중요성은 멀티스레드 프로그래밍과 메모리 맵 입출력(memory-mapped I/O) 환경에서 특히 두드러진다. 컴파일러와 CPU가 수행하는 명령어 재배치로 인해 의도하지 않은 순서로 메모리에 접근하는 문제가 발생할 수 있으며, 메모리 오더링 개념은 이러한 문제를 해결하기 위한 규칙과 도구를 제공한다.