솜은 코튼

[OS] Mutex, 세마포어, 모니터 본문

OS

[OS] Mutex, 세마포어, 모니터

솜.코 2023. 5. 23. 13:33

 

 

Mutex Locks

.

 

임계구역을 보호하기 위해 mutex 락을 사용한다.

 

즉, 프로세스는 임계구역에 들어가기 전에 반드시 락을 획득해야 하고,

빠져나올 때 락을 반환해야 한다.

 

 

 

 

acquire() 함수가 락을 획득하고, relase() 함수가 락을 반환하며

available 변수가 락의 가용 여부를 표시한다.

 

Mutex 락은 실행 가능 여부를 확인하기 위해  acquire() 함수를 반복적으로 실행해야 하는 바쁜 대기를 해야한다. 

이러한 Mutex 락을 '스핀락'이라고도 한다.

 

스핀락은 사용 여부를 계속 확인하면서 대기하기 때문에

문맥 교환이 필요하지 않다는 장점이 있다.

단, 오래 기다리게 된다면 CPU 주기를 낭비하게 된다.

 

 

세마포 (Semaphores)

.

 

앞에 다룬 임계구역 해결 알고리즘은 바쁜 대기를 사용하여 자원을 낭비한다는 단점이 있다.

 

세마포는 mutex와 유사하지만 더 정교하게 동기화 할 수 있는 방법이다.

 

우선 세마포의 자원 할당, 반환 방법을 알아보자

 

 

 

 

세마포는 wait() 함수로 접근을 알리고 세마포 값을 감소하고,

signal() 함수로 자원 반환을 한 후 세마포 값을 증가시킨다.

 

즉, 세마포 값이 0일 경우 모든 자원은 사용 중임을 알린다.

 

코드를 보면 알 수 있듯이 mutex는 true/false 값으로 사용 가능 여부를 판단하지만

세마포는 수의 증감으로 판단한다.

 

 

여기까지만 보면 mutex락과 다를 것이 없다.

mutex락의 바쁜 대기를 해결하기 위해 대기하는 프로세스를 큐에 저장하고,

wake_up 신호를 받으면 큐에서 나와 임계구역에 진입한다.

 

 

 

 

위의 코드를 보면 wait() 함수를 호출할 때 세마포 값이 0보다 작으면

즉, 사용 가능한 자원이 없으면 list에 담는다.

siganl() 함수를 호출할 땐 세마포 값을 증가시키고

list에 있는 프로세스를 제거 후 wakeup을 통해 알려준다.

 

 

이러한 방법으로 반복적으로 함수를 호출하여 상태를 확인하지 않고도 동기화 상태를 알 수 있다.

 

 

세마포는 이진 세마포와 카운팅 세마포로 구분된다.

이진 세마포는 0과 1사이의 값만 가능하며, 카운팅 세마포는 제한 없는 영역을 가진다.

 

 

mutex 락도 true, false의 값만 가지므로 이진 세마포로 대체할 수 있다.

 

여기까지 임계구역 문제를 해결하는 방법에 대해 알아보았는데

이전 알고리즘의 단점들을 해결한 세마포어에도 문제가 있다.

 

세마포어의 잘못된 사용으로 임계구역이 보호받지 못한다는 것이다!!

아래 세가지 상황을 봐보자.

( P()는 wait() 함수를 뜻하고, V()는 signal() 함수를 뜻한다. )

 

 

 

 

첫번째는 프로세스가 세마포어를 사용하지 않은 경우다.

그럼 동시에 프로세스가 임계구역을 진입할 것이다.

 

두번째는 wait() 함수를 두 번 쓴 경우다.

wakeup 신호로 대기 중인 프로세스에게 알려주어야 하는데 발생하지 않아

대기하고 있는 프로세스들이 무한 대기에 빠진다.

 

세번째는 wait() 함수와 signal() 함수를 반대로 사용한 경우다.

자원을 할당 받으면 자원이 하나 감소되어야 하는데

세마포 값을 증가시켜 사용할 수 있는 자원이 하나 더 생긴 상태가 되어

상호 배제가 보장되지 않는다.

 

이러한 문제를 해결하기 위해 자동으로 처리해주는 '모니터'가 구현되었다.

 

 

모니터

.

 

모니터는 인터페이스만 제공한다. 즉, 시스템 호출과 같은 개념이다.

 

 

 

 

임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는

wait() 함수나 signal() 함수를 호출하지 않고 모니터에 작업을 요청한다.

 

모니터는 요청 받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과를 알려준다.

 

 

 

 

 

 

 

 

* 해당 글은 '쉽게 배우는 운영체제'와 '운영체제' 책을 참고하여 작성하였습니다. 출처: 쉽게 배우는 운영체제 (조성호), 운영체제 10판 (Abraham Silberschatz)