Critical Section
은 Race Condition
에서 생기는 문제 구역이다.
예를 들어,
Thread1에
counter += 1;
Thread2에
counter -= 1;
이라는 operation이 있다면, 이때 이 라인들은 크리티컬 섹션이 된다. 이 부분이 크리티컬 섹션이 되는 이유는, 하나의 동작처럼 보이는 이 operation이 사실은 메모리 속 카운터를 register로 가져오고, 덧셈(혹은 뺄셈)을 하고, 다시 레지스터에서 메모리로 갖다놓는 일련의 동작들로 이루어지기 때문이다.
그렇기 때문에 위의 3가지 동작이 Thread1과 Thread2에서 어떤 순서로 전개되는지에 따라 결과가 달라지는 것이다.
상호 배제는 critical section 문제를 해결하기 위한 방법 중 하나이다. critical section에 들어갈 수 있는 thread의 수에 제한을 거는 방법이다. 그리고 이 구역에 들어가기 위해서는, mutex variable
이 필요하다.
mutual exclusion은 concurrency를 막기 때문에 최소한의 구역만을 critical section으로 잡고 상호 배제를 해줘야 한다.
락(lock): 비어있으면 들어가서 잠그고, 이미 차있다면 블락됨. (이 두 가지를 모두 포함하는 개념이 lock이다)
언락(unlock): 잠금을 풀고 나와서 기다리는 쓰레드가 있다면 깨워줌. (마찬가지로 이 두 가지를 모두 포함하는 개념이 unlock이다)
lock, unlock은 모두 상호 간에 지켜줘야만 의미가 있다. (Advisory Mutex)
critical section에 락을 걸고 들어가는 것을 own a mutex
라고 표현한다.