메모리 배리어 (memory barrier)

컴퓨터과학·AI
한 줄 정의: 컴파일러와 프로세서가 메모리 연산의 순서를 바꾸지 못하도록 강제하는 명령입니다.

쉽게 풀면

최적화를 위해 컴파일러와 프로세서는 메모리 읽기·쓰기의 순서를 마음대로 바꿉니다. 혼자 도는 프로그램에서는 결과가 같지만, 다른 스레드가 그 중간 상태를 관찰하면 이야기가 달라집니다. 메모리 배리어는 “이 선을 넘어서 순서를 바꾸지 말라”고 못을 박아, 다른 스레드가 보는 순서까지 보장해 줍니다.

왜 중요한가

락 없이 동작하는 자료구조나 플래그 기반 동기화가 올바르게 작동하려면 반드시 필요한 장치입니다. 이것이 빠지면 대부분의 테스트를 통과하다가 특정 하드웨어나 부하 조건에서만 드물게 실패하는, 가장 잡기 어려운 버그가 생깁니다. 병행 프로그래밍의 정확성을 논할 때 빠질 수 없는 개념입니다.

논문에서는 이렇게 쓰입니다

"플래그 설정 이전에 해제 의미의 메모리 배리어를 삽입하여 초기화 완료 이전 상태가 다른 스레드에 관찰되지 않도록 하였다."

준비가 끝나기 전에 완료 신호가 먼저 보이는 일을 막았다는 뜻입니다.

조금 더 깊게 보면

배리어는 보통 획득 의미와 해제 의미로 구분되어, 획득 이후의 접근이 앞으로 넘어오지 못하게 하거나 해제 이전의 접근이 뒤로 밀리지 못하게 합니다. 가장 강한 형태인 순차 일관성 배리어는 모든 스레드가 같은 전역 순서를 관찰하도록 보장하지만 비용이 큽니다. x86처럼 비교적 강한 메모리 모델에서는 필요한 배리어가 적고 ARM처럼 완화된 모델에서는 더 많이 필요해, 같은 코드가 플랫폼에 따라 다르게 동작하는 원인이 됩니다.

주의할 점

뮤텍스세마포어 같은 동기화 도구는 내부에 적절한 배리어를 이미 포함하고 있으므로, 락을 올바르게 쓰는 코드에서는 직접 삽입할 일이 없습니다. 배리어는 상호 배제를 제공하지 않으며 오직 순서만 보장한다는 점을 혼동하지 말아야 합니다.

관련 용어