메모리 배리어

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

메모리 배리어(memory barrier)는 중앙 처리 장치컴파일러에게 특정 연산의 순서를 강제하도록 하는 기능이다.

중앙 처리 장치에서는 비순차적 명령어 처리 기법을 통해 연산 결과에 영향이 가지 않도록 연산의 순서를 뒤바꿀 수 있으며, 컴파일러에서도 역시 비슷한 최적화를 수행한다. 하지만, 이러한 기능은 여러 스레드가 동시에 돌아가는 경우, 코드의 실행 순서가 바뀌어 실행되는 동안 다른 스레드에서 그 부분에 대한 메모리를 접근하여 잘못된 결과를 내놓을 수 있다. 따라서 특정 부분에 대하여 실행 순서를 강제하는 메모리 배리어를 놓아야 한다.

예제[편집]

다음의 코드는 메모리 배리어가 없는 경우 의도하지 않은 동작을 실행하게 된다:

(스레드 1)

while(x==0) { }
print y;

(스레드 2)

y = 10;
x = 1;

여기에서 스레드 1의 print y;가 원래 의도대로 10을 출력하려면 그 위에서 x==0 조건이 통과해야 한다. 하지만, 스레드 2는 y = 10;x = 1;의 서로 의존성이 없기 때문에, 컴파일러나 CPU가 이 두 연산의 순서를 바꾸는 것이 가능하다. 마찬가지로, 스레드 1에서 print y;에서 변수 y의 값을 읽어들이는 동작이 while(x==0)에서 x의 값을 읽어들이는 동작보다 먼저 일어나는 것이 가능하다.

하드웨어 지원[편집]

x86x86-64 CPU에서는 서로 종속성이 없는 메모리 연산의 순서가 보장되지 않으며, 이를 보장하기 위한 SFENCE, LFENCE, MFENCE 명령어가 존재한다.[1]

각주[편집]

  1. Intel® 64 and IA-32 Architectures Software Developer’s Manual〉. Vol 3A, 8-18 ~ 8-22쪽.

바깥 고리[편집]