스핀 락(Spin lock)은 임계 구역에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킵니다.
임계 구역 진입 전까진 루프를 계속 돌고 있기 때문에 'busy waiting'이 발생하게 됩니다.
다음은 spin lock을 사용하고 있는 세마포어 함수의 예입니다.
wait(S) {
while (S <= 0); // 자원이 없다면 while 루프를 돌며 대기를 함.
S--; // 자원을 획득함.
}
signal(S) {
S++; // 자원을 해제함.
}
스핀 락은 운영체제의 스케줄링 지원을 받지 않기 때문에, 해당 스레드에 대한 문맥 교환(context switch)이 일어나지 않습니다.
짧은 시간 안에 진입할 수 있는 경우 문맥 교환 비용이 들지 않으므로 효율을 높일 수 있습니다.
그 반대의 경우에는 다른 스레드에 cpu를 양보하지 않기 때문에 오히려 cpu 효율을 떨어뜨리게 됩니다.
스핀 락은 문맥 교환이 일어나지 않기 때문에 멀티 프로세서 시스템에서만 사용할 수 있습니다
뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호 배제 기술입니다.
뮤텍스는 Locking 메커니즘으로 락을 걸은 스레드만이 임계 영역을 나갈 때 락을 해제할 수 있습니다.
다음은 뮤텍스를 사용하여 상호 배제를 구현한 예입니다.
do {
wait (mutex);
// Critical section
signal (mutex);
// Remainder section
} while (TRUE);
잠금 메커니즘이라는 점은 스핀 락과 동일하나 권한을 획득할 때까지 busy waiting 상태에 머무르지 않습니다.
대신 sleep 상태로 들어가고 wakeup 되면 다시 권한 획득하려는 시도인 sleep lock을 사용합니다.
세마포어는 음수가 아닌 정수 값을 가지고 스레드 간에 공유되는 변수입니다.
이 변수는 임계 구역 문제를 해결하고 동기화를 구현하는 데 사용됩니다.
세마포어는 signaling 메커니즘으로 락을 걸지 않은 스레드도 signal을 사용해 락을 해제할 수 있습니다.
세마포어는 자원의 개수를 의미하기도 합니다.
세마포어는 사용할 수 있는 자원의 개수에 따라 두 가지 유형이 있습니다.
세마포어(S)는 wait 연산과 signal 연산을 가지고 있습니다.
이 두 연산은 atomic 하게 동작합니다.
자원을 획득하는 연산
자원을 해제하는 연산