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++에 대한 통제가 이루어지지 않아 경쟁 상태가 발생하였다.
다음 게시글에서는 임계 영역을 통제하는 방법에 대해 알아볼 것이다.