본문 바로가기
카테고리 없음

Memory Barrier는 왜 필요할까

by by_merry 2026. 5. 21.

멀티코어 CPU와 동시성(concurrency) 구조를 공부하다 보면 어느 순간부터는 “컴퓨터가 생각보다 너무 자유롭게 움직이고 있다”는 느낌을 받게 된다. 나도 처음에는 프로그램 코드가 위에서 아래 순서대로 그대로 실행되는 줄 알았다. 예를 들어 1번 코드 다음에 2번 코드가 있고, 그다음 3번 코드가 있으면 CPU도 당연히 그 순서대로 처리한다고 생각했다. 그런데 실제 CPU는 성능을 높이기 위해 명령어 순서를 내부적으로 바꾸기도 하고, 메모리 접근 순서를 최적화하기도 한다는 걸 알고 꽤 충격이었다.

특히 싱글코어 환경에서는 별문제가 없어 보이던 코드가 멀티코어 환경으로 가는 순간 갑자기 이상하게 동작할 수 있다는 점이 인상 깊었다. 그리고 이런 문제를 막기 위해 등장한 개념 중 하나가 바로 Memory Barrier다.

 

CPU는 성능을 위해 명령어 순서를 바꾸기도 한다

처음 CPU 구조를 공부할 때 가장 놀랐던 것 중 하나는 CPU가 프로그램 코드를 “있는 그대로”만 실행하지 않는다는 점이었다. 현대 CPU는 파이프라인, Out-of-Order Execution, Speculative Execution 같은 기술들을 사용하면서 최대한 쉬지 않고 계속 일하려고 한다.

문제는 이 과정에서 CPU가 내부적으로 명령어 실행 순서를 바꿀 수도 있다는 점이다. 예를 들어 프로그램 코드상으로는 A 다음 B 순서인데, CPU 입장에서는 성능상 B를 먼저 처리하는 게 더 효율적일 수도 있다.

처음에는 나도 “그럼 프로그램 결과가 달라지는 거 아닌가?” 싶었는데, 단일 스레드 환경에서는 CPU가 최종 결과만 같게 유지하면 대부분 문제되지 않는다. 그래서 평소에는 이런 재정렬(reordering)을 거의 의식하지 않고 프로그램을 사용하게 된다.

그런데 멀티코어 환경에서는 이야기가 달라진다. 다른 코어가 메모리를 동시에 보고 있는 상황에서는 “어떤 순서로 값이 보이느냐” 자체가 굉장히 중요해질 수 있기 때문이다.

나도 처음에는 CPU가 내부 최적화를 이렇게 공격적으로 하는 줄 몰랐다. 그냥 계산 속도만 빠른 줄 알았는데, 실제로는 명령어 순서까지 계속 조정하면서 최대한 효율적으로 움직이고 있었던 것이다.

멀티코어 환경에서는 메모리 순서가 꼬일 수 있다

멀티코어 환경에서는 각 코어가 자신만의 캐시(Cache)를 가지고 있고, 동시에 메모리에 접근한다. 문제는 CPU 재정렬과 캐시 동기화가 함께 섞이면 다른 코어 입장에서 메모리 상태가 예상과 다르게 보일 수 있다는 점이다.

예를 들어 한 스레드가:

  • 데이터 저장
  • “준비 완료” 플래그 변경

순서로 작업한다고 해보자.

개발자 입장에서는 당연히 데이터 저장이 끝난 뒤 플래그가 바뀔 거라고 생각한다. 그런데 CPU가 성능 최적화를 위해 순서를 재정렬하면 다른 코어에서는 플래그가 먼저 보일 수도 있다.

즉, 다른 스레드는 “준비 완료” 상태를 확인했는데 실제 데이터는 아직 업데이트되지 않은 상황이 발생할 수 있는 것이다.

나도 처음 이 예시를 봤을 때 꽤 충격이었다. 코드상으로는 분명 순서가 맞는데, 실제 CPU 내부에서는 다른 흐름으로 움직일 수 있다는 게 생각보다 직관적이지 않았기 때문이다.

특히 멀티코어 환경에서는 이런 문제가 아주 드물게만 발생할 수도 있어서 디버깅이 더 어려워진다고 한다. 어떤 때는 정상인데, 특정 CPU 환경이나 타이밍에서만 이상 동작이 나오는 경우도 많다고 한다.

그걸 보면서 처음으로 “동시성 프로그래밍이 왜 그렇게 어려운지” 조금 실감하게 됐다.

Memory Barrier는 CPU에게 ‘이 순서는 꼭 지켜라’라고 알려주는 장치다

Memory Barrier는 쉽게 말하면 CPU에게 “여기서는 명령어 순서를 함부로 바꾸지 마라”라고 알려주는 장치에 가깝다.

즉, 특정 메모리 작업 이전과 이후의 순서를 강제로 보장해주는 역할을 한다.

예를 들어 중요한 데이터 저장이 끝나기 전에는 “준비 완료” 플래그를 절대 먼저 보이지 않게 만드는 식이다. 이렇게 해야 다른 코어들도 메모리 상태를 올바른 순서로 인식할 수 있다.

처음에는 나도 “CPU가 알아서 잘 처리하면 되는 거 아닌가?”라고 생각했는데, 실제로는 CPU가 너무 똑똑하게 최적화를 하다 보니까 오히려 개발자가 일부 순서를 강제로 제한해야 하는 상황이 생기는 것이었다.

특히 최신 CPU일수록 내부 최적화가 훨씬 공격적으로 이루어지기 때문에, 서버나 멀티스레드 프로그램에서는 Memory Barrier 같은 개념이 굉장히 중요해졌다고 한다.

나도 예전에는 멀티코어 CPU가 단순히 “코어 여러 개 있는 빠른 CPU” 정도로만 느껴졌는데, 지금은 내부적으로 캐시, 재정렬, 동기화까지 전부 함께 움직이는 굉장히 복잡한 시스템이라는 생각이 든다.

결국 현대 컴퓨터는 단순히 계산을 빨리하는 기계가 아니라, 수많은 코어와 메모리 흐름을 얼마나 안정적으로 맞출 수 있느냐가 핵심인 시대가 된 것이다.

한 줄로 정리하면 Memory Barrier는 CPU와 메모리의 재정렬로 인해 멀티코어 환경에서 순서가 꼬이지 않도록, 특정 메모리 작업의 실행 순서를 강제로 보장하는 장치다.