본문 바로가기
프로그래밍/Game Dev

[C#] 메모리 베리어

by YuminK 2023. 8. 26.

하드웨어는 최적화를 위해 연관성이 없는 연산의 순서를 바꿀 수 있다. 

이러한 최적화를 막기 위해 메모리 베리어를 사용한다. 

 

메모리 베리어의 기능 

1. 코드 재배치 억제

2. 가시성

 

재배치 억제는 하드웨어의 연산 최적화를 허용하지 않는 것이다. 

가시성은 데이터를 메모리에 올리고, 다시 받아오는 개념이다. 

 

메모리 베리어의 종류

1. Full Memory Barrier: Store/Load 둘 다 막는다. 
2. Store Memory Barrier: Store만 막는다.
3. Load Memmory Barrier: Load만 막는다.

 

다음 프로그램에서 r1과 r2에는 0이 들어가지 않을 것처럼 보이지만, 실제로는 0이 들어가 loop를 빠져나온다. 

이는 컴파일러에서 최적화를 위해 연산 순서를 재배치하기 때문이다. 

 

class ThreadProgram
{
        static int x = 0;
        static int y = 0;
        static int r1 = 0;
        static int r2 = 0;

        static void Thread_1()
        {
            y = 1; // store y
            r1 = x; // load x
        }

        static void Thread_2()
        {
            x = 1; // store x
            r2 = y; // load y
        }

        static void Main(string[] args)
        {
            int count = 0;
            while(true)
            {
                ++count;
                x = y = r1 = r2 = 0;

                Task t1 = new Task(Thread_1);
                Task t2 = new Task(Thread_2);
                t1.Start();
                t2.Start();

                Task.WaitAll(t1, t2);

                if (r1 == 0 && r2 == 0)
                    break;
            }

            Console.WriteLine($"{count}만에 빠져나옴");
        }
    }

 

위 예제의 함수에 메모리 베리어를 사용하는 경우, 무한 루프에 빠지게 된다. 

 

       static void Thread_1()
        {
            y = 1; // store y

            // -----------------------------
            Thread.MemoryBarrier();

            r1 = x; // load x
        }

        static void Thread_2()
        {
            x = 1; // store x

            // -----------------------------
            Thread.MemoryBarrier();

            r2 = y; // load y
        }

 

'프로그래밍 > Game Dev' 카테고리의 다른 글

[C#] Interlocked  (0) 2023.08.26
[C#] MessagePack  (0) 2023.08.26
[C#] 캐시 메모리 철학  (0) 2023.08.26
[C#] 쓰레드 생성  (0) 2023.08.26
채용 정보를 통해 알아보는 게임 서버 기술 스택 정리  (0) 2023.08.19

댓글