Skip to content

Memory barrier

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

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

Memory visibility

메모리 가시성(Memory visibility)은 Thread에서 변경한 특정 메모리 값이 다른 Thread에서 정상적으로 읽어지는가 라고 할 수 있다.

Example

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

(스레드 1) <code>

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

</code>

(스레드 2) <code>

y = 10;
x = 1;

</code>

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

Android SMP (Symmetric Multiprocessor)

대칭적 멀티프로세서symmetric multiprocessor 시스템을 위한 C, C++, Java 프로그램 언어 강좌:

  • Android SMP(1) - 메모리 일관성 모델: Kandroid.org_-_android_smp_01.pdf
  • Android SMP(2) - 데이터 메모리 장벽: Kandroid.org_-_android_smp_02.pdf
  • Android SMP(3) - 원자적 오퍼레이션: Kandroid.org_-_android_smp_03.pdf
  • Android SMP(4) - 사례, C에서 하지 말 것: Kandroid.org_-_android_smp_04.pdf
  • Android SMP(5) - 사례, Java에서 하지 말 것: Kandroid.org_-_android_smp_05.pdf
  • Android SMP(6) - 사례, 해야 할 것: Kandroid.org_-_android_smp_06.pdf
  • Android SMP(7) - 부록: Kandroid.org_-_android_smp_07.pdf

See also

Favorite site

Preshing on Programming

References


  1. Volatile_and_memory_barrier.pdf 

  2. Kernel.org-doc-memory-barriers.txt.zip 

  3. Egloos_zum_com-sweeper-c++11_std_atomic.pdf 

  4. Jake.dothome.co.kr_-_Barriers.pdf 

  5. Linux_-doc-ko-_memory-barriers.txt.zip