CS/운영체제

경쟁 상태와 임계 영역(Critical section)

alpacadabra 2022. 9. 6. 01:33

경쟁 상태에 대해서는 이전 게시글에서도 설명했다.

 

 

경쟁 상태(Race condition)의 간단한 예시

전역 변수 count = 5에 대하여 각각의 스레드가 count++, count--를 한 번씩 수행하도록 했다. 그렇다면 두 스레드가 모두 Join되었을 때 count는 5를 그대로 유지하고 있을까? ... 만약 그렇다고 생각했다

sete3683.tistory.com

 

경쟁 상태는 여러 프로세스(혹은 스레드)가 동시에 공유 자원에 접근하기 때문에 발생한다.

그래서 우리는 공유 자원에 대하여 한 번에 하나의 프로세스만이 이에 접근할 수 있도록 통제해야 하는데,

그러한 통제가 필요한 영역을 임계 영역(Critical section)이라고 부른다.

 

공룡책

 

임계 영역은 입장 영역(Entry section)퇴장 영역(Exit section)을 기준으로 구분된다.

추후 살펴보겠지만 각 프로세스는 입장 영역에서 권한을 획득하고 퇴장 영역에서 권한을 반환하는 식으로 통제가 이루어진다.

따라서, 프로그래머가 해야할 일은 임계 영역을 특정하고 프로세스에게 권한을 부여-회수하는 것이다.

 

아래는 C#으로 작성한 예시이다.

 

class Program
{
    static int count = 0;

    static void Main()
    {
        Thread t1 = new Thread(new ThreadStart(Add));
        Thread t2 = new Thread(new ThreadStart(Add));

        t1.Name = "t1";
        t2.Name = "t2";

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();

        Console.Write(count);
    }

    static void Add()
    {
        for (int i = 0; i < 10000; i++)
        {
            //Entry section
            count++; //Critical section
            //Exit section
        }

        Console.WriteLine("Join " + Thread.CurrentThread.Name); //Remainder section
    }
}

 

실행 결과

 

위 코드에서는 임계 영역인 count++에 대한 통제가 이루어지지 않아 경쟁 상태가 발생하였다.

다음 게시글에서는 임계 영역을 통제하는 방법에 대해 알아볼 것이다.