sleepyotter
메모리 배리어 본문
하드웨어 최적화에 관련된 것. 하드웨어도 컴파일러처럼 최적화를 한다.
CPU가 서로 의존성이 없는 명령어라고 판단하면 순서를 멋대로 바꿔 버린다.
static void Thread1()
{
y=1;
r1=x;
}
static void Thread2()
{
x=1;
r2=y;
}
와 같은 함수 2개가 있고 동시에 2개의 스레드에서 작동한다면? (4개의 변수 모두 0으로 세팅.)
r1과 r2모두 0일 때 while루프를 빠져나오도록 짜놨다면 이상적인 결과는 빠져나오지 않아야 한다.
하지만 빠져나온다. 바로는 아니고 몇 천 번 정도 루프를 돌다보면...
y=1 과 r1=x 사이에는 아무 연관성이 없기 때문에 CPU가 멋대로 r1=x를 먼저 실행할 수도 있다.
그렇게 되면 두 스레드 모두 2번째 줄이 먼저 실행될 경우 while 루프를 빠져나오게 된다. 이를 막기 위해 메모리 배리어를 사용한다.
메모리 배리어 사용 이유
1. 코드 재배치 방지
- 위의 문제를 방지하기 위해 사용한다. Thread.MemoryBarrier(); 를 두 라인 사이에 넣어줌으로써 해결
2. 가시성
- 1번 스레드에게 작업을 요청했을 때, 다른 모든 스레드들이 이를 아는 것을 가시성이라 한다. 즉, 1번 스레드는 작업을 받자마자 공동으로 쓰는 메모리에 동기화하고 2번 스레드는 어떤 작업을 받아서 하기 전에 먼저 메모리에 동기화 한 후에 작업을 시작한다. MeoryBarrier를 만나면 메모리와 동기화 한 후에 값을 가져온다.