임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역에 들어간다. 이후 도착한 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다린다. 프로세스가 작업을 마치면 세마포어는 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보낸다.
세마포어는 다른 알고리즘과 달리 바쁜 대기, 임계구역이 잠겼는지 직접 확인 또는 다른 프로세스에게 동기화 메시지를 보낼 필요가 없다.
- 일반적으로 세마포어에서 임계영역에 진입을 시도했지만 실패한 프로세스에 대해 block()을 시켜 임계영역이 자리가 날 때 다시 깨우는 방식을 사용하므로 바쁜 대기로 인한 낭비가 해결된다.
Semaphore(n); // RS = n; n은 공유 가능한 자원의 수
P(); // 임계영역을 들어가기 전 사용 중이라 변경
/*
Critical Section
*/
V(); // 임계영역을 나오고 비었다고 표시함
- 카운팅 세마포어 : 가용한 개수를 가진 자원에 대한 접근 제어용으로 사용되며 세마포어는 그 가용한 자원의 개수로 초기화 된다. 자원을 사용하면 세마포어가 감소, 방출하면 세마포어 증가한다.
- 이진 세마포어 : MUTEX, 0과 1의 값만 가능하며 다중 프로세스들 사이의 임계영역 문제를 해결하기 위해 사용한다.
세마포어의 문제는 잘못된 사용으로 인해 임계구역이 보호받지 못한다는 것이다. 위 처럼 사용자가 고의로 세마포어를 사용하지 않거나 사용 중에 실수를 해서 문제가 생긴 경우이다.
1. 프로세스가 세마포어를 사용하지 않고 바로 임계구역에 진입하여 임계구역을 보호할 수 없다.
2. P()를 두번 사용하여 wake_up 신호가 발생하지 않은 경우이다. 프로세스 간의 동기화가 이루어지지 않아 세마포어 큐에서 대기하고 있는 프로세스들이 무한 대기에 빠진다.
3. P()와 V()를 반대로 사용해 상호배제가 보장되지 않은 경우로 임계구역을 보호할 수 없다.
P(), V()를 굳이 사용할 필요 없이 자동으로 처리하도록 하는 것이 모니터이다.
모니터는 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화를 시킨다. 시스템 콜과 같은 개념이다.
모니터의 작동 원리
- 임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 P(), V()를 사용하지 않고 모니터에 작업 요청을 한다.
- 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려준다.