그럼 어떻게 mutual exclusion을 보장할 수 있을까?
-> lock을 활용하자!
do{
acquire lock
critical section
release lock
remainder section
} while (true)
volatile int lock = 0;
void critical() {
while(test_and_set(&lock) ==1);
...critical section
lock = 0;
}
int test_and_set(*int lockPtr){
int oldLock = *lockPtr;
*lockPtr = 1;
return oldLock;
}
이럴 때 만약 T1, T2가 있다고 가정하고 test_and_set을 동시에 실행시키면 동시에 critical section에 들어가지 않을까? 하는 의문이 들수도 있는데 이때 CPU 의 atomic 명령어인 test_and_set은 원자성을 유지하기 때문에 괜찮다!
즉, 스핀락은 락을 가질 수 있을 때까지 반복해서 시도!
하지만 기다리는 동안 CPU 낭비 심해..!
그래서 뮤텍스를 한 번 보자!
뮤텍스는 락을 가질 수 없다면 큐에 넣어서 기다리고 락을 가지고 있을 때 프로세스를 깨워서 락을 가지게 하는 것이다. 즉, 락을 가질 수 있을 때까지 쉬는 것이다.
그렇다면! 뮤텍스가 스핀락보다 항상 좋은가?
좋은 경우도 있다!
signal mechanism을 가진 하나 이상의 프로세스 혹은 스레드가 critical section에 접근 가능하도록 하는 장치
이런 유용한 정보를 나눠주셔서 감사합니다.