메모리 배리어
메모리 배리어(memory barrier)는 중앙 처리 장치나 컴파일러에게 특정 연산의 순서를 강제하도록 하는 기능이다.
중앙 처리 장치에서는 비순차적 명령어 처리 기법을 통해 연산 결과에 영향이 가지 않도록 연산의 순서를 뒤바꿀 수 있으며, 컴파일러에서도 역시 비슷한 최적화를 수행한다. 하지만, 이러한 기능은 여러 스레드가 동시에 돌아가는 경우, 코드의 실행 순서가 바뀌어 실행되는 동안 다른 스레드에서 그 부분에 대한 메모리를 접근하여 잘못된 결과를 내놓을 수 있다. 따라서 특정 부분에 대하여 실행 순서를 강제하는 메모리 배리어를 놓아야 한다.
예제
[편집]다음의 코드는 메모리 배리어가 없는 경우 의도하지 않은 동작을 실행하게 된다:
(스레드 1)
|
(스레드 2)
|
여기에서 스레드 1의 print y;
가 원래 의도대로 10을 출력하려면 그 위에서 x==0
조건이 통과해야 한다. 하지만, 스레드 2에서 y = 10;
와 x = 1;
는 서로 의존성이 없기 때문에, 컴파일러나 CPU가 이 두 연산의 순서를 바꾸는 경우도 있다. 마찬가지로, 스레드 1에서 print y;
에서 변수 y의 값을 읽어들이는 동작이 while(x==0)
에서 x의 값을 읽어들이는 동작보다 먼저 일어나는 경우도 있다. 두 명령 사이에 메모리 배리어를 설치함으로써 컴파일러나 CPU가 두 명령의 순서를 지키도록 강제하여 원하는 결과를 얻을 수 있다.
하드웨어 지원
[편집]x86과 x86-64 CPU에서는 서로 종속성이 없는 메모리 연산의 순서가 보장되지 않으며, 이를 보장하기 위한 SFENCE, LFENCE, MFENCE 명령어가 존재한다.[1]
같이 보기
[편집]각주
[편집]- ↑ “Intel® 64 and IA-32 Architectures Software Developer’s Manual” (PDF): Vol 3A, 8-18 ~ 8-22.
외부 링크
[편집]이 글은 컴퓨터 과학에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |