본문 바로가기
cs공부/운영체제

운영체제 - 컴파일러 최적화(Release, volatile)

by 코딩하는 돼징 2023. 4. 27.
반응형

쓰레드를 사용할 떄 스택 메모리는 다 각자 자기만의 메모리 할당

전역 변수는 모든 쓰레들이 공통적으로 사용해서 동시 접근 가능하다.

class Program
{
    static bool _stop = false;

    static void ThreadMain()
    {
        Console.WriteLine("쓰레드 시작");

        while(_stop == false)
        {
            // 누군가가 stop 신호를 해주기를 기다린다.
        }

        Console.WriteLine("쓰레드 종료");
     }
     static void Main(string[] args)
     {
        Task t = new Task(ThreadMain);
        t.Start();

        Thread.Sleep(1000); // 1초 동안 대기

        _stop = true;

        Console.WriteLine("Stop 호출");
        Console.WriteLine("종료 대기중");

        t.Wait();

       Console.WriteLine("종료 성공");
    }
}


Release

게임을 릴리즈 할 때는 Debug가 아니라 Release를 사용하는데 온갖 최적화가 들어가서 프로그램이 빨라진다. 최적화를 많이 한다는 것은 프로그램을 만들 때 디버깅을 하기가 어려워 진다는 말이다. 그러므로 여러 버그들이 생겨날 수 있다. 브레이크 포인트를 잡아놔도 안걸릴 수 있다.


컴파일러 입장에서 기계어로 번역되면서 어떠한 점이 바뀌었는지 우리를 위해서 최적화를 해줬는데 멀티쓰레드인 것을 인지하지 못한다.

while(_stop == false)
{
    // 누군가가 stop 신호를 해주기를 기다린다.
}

_stop == false만 봤을때 _stop값이 바뀌지 않으니까 _stop을 조건문으로 빼온 것이다. 로직은 똑같다.

if(_stop == false)
{
    while(true)
    {

    }
}

최적화를 안하게 하는 방법

volatile

휘발성 데이터 - 언제 변할지 모르니까 최적화 하지 말아줘

volatile static bool _stop = false;

정상 출력 되는 것을 확인

 

 

 

 

참고 :  본 내용은 MMORPG  PART4 강의를 수강하여 작성하였습니다.

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

반응형

댓글