다중프로그래밍으로 여러 작업을 동시에 실행가능한 환경이 됐다. 이러한 환경은 탁월한 성능 및 메모리를 자랑한다. 하지만, 그에 대한 대가로 공유자원을 여러 프로세스, 혹은 스레드에서 사용하게 되어 데드락(교착 상태)이 자주 발생하게 되는`동기화 문제`가 자주 발생하게 된다.
OS에서의 데드락을 발생시키는 원인은 상호배제, 점유대기, 비선점, 순환대기가 있는데, 이 4가지가 모두 지켜지지 않으면 데드락이 발생한다. 이번에 포스팅할 뮤텍스, 스핀락, 세마포어 방식은 위 4가지 조건 중 상호배제를 준수하여 데드락이 발생되지 않도록 하는 방법이다.
뮤텍스(Mutex)
정의 자체는 여러 스레드를 실행하는 환경에서 자원 접근에 대한 제한을 위한 메커니즘이다.
하지만 이 정의로는 완벽하게 이해하기 어렵다.
아래 그림을 통해 이해해보자.
위와 같이 임계 구역(Critical Section)에 해당하는 공유 자원이 있다고 하자. 여기서 임계 구역이란, 서로 다른 두 프로세스 또는 스레드가 접근할 수 없는 공유 영역을 말한다.
그림처럼 스레드 1이 key에 해당하는 어떠한 오브젝트를 가져 뮤텍스 객체에 접근하여 공유 자원을 이용하는 중이라 하자.
스레드 1이 임계 구역에 접근하여 공유 자원을 사용중이기 때문에 상태를 lock으로 바꿔주었다.
스레드 2는 현재 뮤텍스 객체의 상태가 lock이므로 해당 공유 자원을 이용하지 못하고 block되어 sleep 상태로 대기하게 된다. 이후에 뮤텍스 객체의 상태가 unlock이 되면 wakeup 하여 뮤텍스 객체 접근 권한을 요청하게 된다.
이렇게 임계 구역에 접근하는 메커니즘을 뮤텍스라고 한다.
스핀락(Spin Lock)
뮤텍스에서 설명한 예시와 비슷하지만, 스레드2가 sleep 상태로 대기하는 것이 아닌 접근 권한을 계속해서 요청한다.
그렇기 때문에 스레드2가 busy-waiting 상태에 있다고 말한다.
싱글코어 프로세스에서는 공유자원 관리와 busy-waiting 스레드 관리를 동시에 처리할 수 없다. 따라서 스핀락 방법은 멀티코어 프로세스에서만 사용될 수 있는 방법이다.
또한, 컨텍스트 스위칭(Context Switching) 시간이 짧을수록 스핀락 방식이 유리하다. 점유를 포기하는 것보다 그냥 기다리는 시간이 더 짧다는 의미이기 때문이다.
세마포어(Semaphore)
공유 자원을 하나의 스레드만 접근할 수 있게 하는 방식이었던 뮤텍스와 달리, 세마포어는 지정된 개수만큼의 스레드가 동시에 접근하도록 동기화할 수 있게 하는 방식을 의미한다.
위 그림은 3개의 스레드까지 공유 자원에 접근할 수 있게 세마포어가 지정된 예시이다.
스레드는 공유 자원을 사용하려 접근할 때 P 함수가 실행되며, 세마포어의 숫자를 1 감소시킨다.
세마포어 숫자가 음수일 경우, 해당 프로세스 또는 스레드(스레드4, 스레드5)는 공유 자원을 이용할 수 없다는 의미이므로 대기 큐에 넣어 block된다.
스레드 1이 공유 자원을 사용하지 않는 상태가 될 때 V 함수를 실행한다. V 함수가 실행되면 세마포어 숫자를 1 증가시킨다.
스레드 1이 V 함수를 실행하면서 나오고, 대기 큐에 있던 스레드 4가 공유 자원을 사용하는 것을 확인할 수 있다.
중요한 점은, 세마포어는 뮤텍스가 될 수도 있다는 것이다.
1개의 프로세스 또는 스레드만 공유 자원을 사용할 수 있게 하면 뮤텍스처럼 이용이 가능하다.
이러한 특성 때문에 뮤텍스를 이진 세마포어라 하기도 한다.
또한 뮤텍스 기법은 잠금 메커니즘인 lock을 가지는 형태로 자원을 소유할 수 있지만, 세마포어 기법은 신호 메커니즘으로 정수값을 이용하여 프로세스의 리소스 해제 및 획득 여부를 관리할 수 있다. (뮤텍스는 객체, 세마포어는 정수값이다.)
그리고 뮤텍스 기법은 특정 프로세스가 lock을 획득하면 동일 프로세스만 lock을 해제할 수 있고, 세마포어 기법에서는 동일 프로세스가 아닌 모든 프로세스에서 값을 변경할 수 있다.
참고
- https://www.shiksha.com/online-courses/articles/mutex-vs-semaphore-what-are-the-differences/
- https://youtu.be/oazGbhBCOfU
- https://chelseashin.tistory.com/m/40