뮤텍스 락
뮤텍스 락 (Mutex Locks)
뮤텍스 락은 임계 구역을 보호하고 경쟁 조건(Race Condition)을 방지하는 데 사용되는 가장 간단한 동기화 도구입니다. '뮤텍스(mutex)'는 상호 배제(mutual exclusion)의 줄임말입니다.
기본 개념
뮤텍스 락을 사용하려면 프로세스가 임계 구역에 들어가기 전에 락을 **획득(acquire)**해야 하고, 임계 구역에서 나올 때 락을 **해제(release)**해야 합니다1.
뮤텍스 락은 available
이라는 불리언 변수를 가집니다.
available
이true
이면 락을 획득할 수 있습니다. 락이 획득되면available
은false
로 설정됩니다2.락이
available
하지 않을 때(즉,false
일 때) 락을 획득하려는 프로세스는 락이 해제될 때까지 블록됩니다3.
acquire()
와 release()
함수는 원자적으로(atomically) 수행되어야 합니다. 이는 이들 함수가 실행되는 동안 다른 어떤 프로세스도 동일한 뮤텍스 락의 값을 동시에 수정할 수 없음을 의미합니다4.
바쁜 대기(Busy Waiting) 문제
여기서 설명된 뮤텍스 락 구현의 주된 단점은 **바쁜 대기(busy waiting)**를 수반한다는 점입니다5. 프로세스가 임계 구역에 있는 동안, 다른 프로세스가 임계 구역에 진입하려고 하면
acquire()
호출에서 계속해서 루프를 돌며 대기합니다6. 이는 CPU 자원을 낭비하며, 특히 단일 CPU 코어를 여러 프로세스가 공유하는 다중 프로그래밍 시스템에서 문제가 됩니다7.
스핀락(Spinlocks)
이러한 뮤텍스 락을 **스핀락(spinlock)**이라고도 부르는데, 프로세스가 락을 얻기 위해 '스핀(spin)'하며 기다리기 때문입니다8. 스핀락은 프로세스가 락을 기다리는 동안 문맥 교환(context switch)이 필요하지 않다는 장점이 있습니다9. 문맥 교환은 상당한 시간이 소요될 수 있으므로, 락이 아주 짧은 시간 동안만 유지되는 다중 코어 시스템에서는 스핀락이 선호될 수 있습니다10.
락 경합(Lock Contention)
락은 **경합(contended)**되거나 **비경합(uncontended)**될 수 있습니다11.
경합 락: 스레드가 락을 획득하려고 할 때 블록되는 경우입니다12. 높은 경합은 동시성 애플리케이션의 전반적인 성능을 저하시키는 경향이 있습니다13.
비경합 락: 스레드가 락을 획득하려고 시도할 때 락이 사용 가능한 경우입니다14.
뮤텍스 락과 스핀락은 많은 운영체제에서 널리 사용되며, 다음 섹션에서 고전적인 동기화 문제를 해결하는 데 어떻게 사용되는지 더 자세히 다룹니다.
Last updated