임계영역(Critical section)
공유자원에 접근할 수 있는 영역을 말한다. 임계 영역은 반드시 보호 되어야하는 구간으로 상호 배제(mutual exclusion)해야 합니다. 이런 상호배제를 구현하기 위해서는 아래의 조건을 만족 해야합니다.
- 임계 구역에서의 실행은 Atomic 해야 합니다.
- 오직 하나의 쓰레드만이 임계구역 내에서 실행 가능하게 해야합니다.
- 모든 다른 쓰레드는 기다리는 상태에 들어가게 됩니다.
- 쓰레드가 임계 구역을 빠져나오면 다른 쓰레드가 들어가게 됩니다.
임계 구역을 balance = balance + 1
라고 가정한 후 구현하면 아래와 같이 만들 수 있습니다.
lock_t mutex;
...
lock(&mutex);
balance = balance + 1;
unlock(&mutex);
여기서 lock_t mutex
는 현재 락 상태를 보관하는 변수로 두 가지의 상태가 가능합니다.
다음으로 lock(&mutex) ... unlock(&mutex)
는 무엇인지 각각을 알아보면 아래와 같습니다.
unlock()
을 부르는 경우, 락은 다시 available(free) 상태가 됩니다.이러한 락은 아래의 방법을 통해서 사용할 수 있습니다.
예제 코드로 구현을 하면 아래와 같이 됩니다.
int withdraw(account, ammount){
lock(lock);
// ----- CRITICAL SECTION ----- //
balance = get_balance(account);
balance = balance - amount;
put_balance(account, balance);
// ----- CRITICAL SECTION ----- //
unlock(lock);
return balance;
}
그리고 락은 필히 아래와 같은 요구 사항을 충족할 수 있을 때 좋은 락이라고 할 수 있습니다.
락 제작 방법에는 총 3가지 방법이 존재합니다.
1. 인터럽트 제어 방법 (controlling interrupts)
2. 소프트웨어적 방법론으로만 제작하는 방법 (software-only algorithm)
3. 하드웨어를 활용하여 제작하는 방법 (Hardware atomic Instructions)
인터럽트 | 소프트웨어 | 하드웨어 |
---|---|---|
Dekker’s Algorithm | Test-and-Set | |
세부 분류 없음 | Peterson’s Algorithm | Comapare-and-Swap |
Lamport’s Bakery algorithm | Load-Linked(LL) and Store-Conditional(SC) | |
Fetch-and-Add |