멀티 스레딩의 문제점에서 나오듯, 동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역을 Critical section이라고 한다. 즉, 여러 개의 프로세스가 동시에 접근할 때 문제가 발생할 수 있는 영역이다.
프로세스들이 임계 영역을 함께 사용할 수 있는 프로토콜을 설계하는 것
해결을 위한 조건들은 다음과 같다.
프로세스 1이 임계 영역에서 실행 중일 경우, 다른 프로세스들은 그들이 가진 임계 영역에서 실행될 수 없어야 한다.
임계 영역에서 진행 중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만이 임계 영역 진입 후보로 참여할 수 있다.
프로세스 1이 임계 영역 진입 신청 후부터 받아들여질 때까지, 다른 프로세스들이 임계 영역에 진입하는 횟수는 제한이 있어야 한다.
하드웨어 기반의 해결책으로 동시에 공유 자원에 접근하는 것을 막기 위해 임계 영역에 진입하는 프로세스는 Lock을 획득하고, 임계 영역을 빠져나올 때 Lock을 방출함으로써 동시 접근이 혀용되지 않는다. Lock을 잡고 임계 영역에 진입하게 되면 다른 프로세스들은 해당 임계 영역에 들어갈 수 없다.
다중처리기 환경에서는 시간적인 효율성 측면에서 적용할 수 없다.
소프트웨어 기반의 임계 영역 문제를 해결하기 위한 동기화 도구이다. 단순히 공유 자원의 개수를 나타내는 변수라고 이해해도 된다.
운영체제는 세마포를 Counting과 Binary로 구분한다.
가용한 개수를 가진 자원에 대한 접근 제어용으로 사용되며, 세마포는 그 가용한 자원의 개수로 초기화된다. 자원을 사용하면 세마포가 -1, 자원을 반납하면 세마포가 +1된다. 즉, 세마포가 0이 되면 더 이상 자원을 사용할 수 없는 상태이고, 세마포가 3이라면 3개의 프로세스가 자원을 사용할 수 있는 상태이다.
MUTEX라고도 부르며, 상호배제 (Mutual Exclusion)의 머릿글자를 따서 만들어졌다. 이름 그대로 0과 1 사이의 값만 가능하며, 다중 프로세스들 사이의 임계 영역 문제를 해결하기 위해 사용된다.
프로세스 1이 자원을 사용하고 있다면 세마포는 0이 되고, 자원을 반납하면 세마포는 1이 된다.
세마포와 Lock은 비슷하지만 다르다. Lock은 프로세스 1이 자원을 사용중일 때 1이 되고 자원을 반납하면 0이 된다. 그러나 세마포는 반대로 사용중일때 0, 반납하면 1이 된다. 또한 세마포는 Lock과 다르게 1로 초기화된다.
Spin lock이라고 불리는 세마포 초기 버전에서 임계 영역에 진입해야 하는 프로세스는 진입 코드를 계속 반복실행하며 기다리게 된다. 이 과정은 CPU를 낭비하게 되는 과정이다. 이를 Busy Waiting이라고 부르며 특수한 상황이 아니라면 비효율적이다.
일반적으로 세마포에서 임계 영역에 진입을 시도했지만 실패한 프로세스에 대해 Block시키고, 임계 영역에 자리가 날 때 다시 깨우는 방식을 사용한다. 이 방법을 통해 Busy Waiting으로 인한 시간 낭비를 해결할 수 있다.
세마포가 Ready Queue를 가지고 있고, 둘 이상의 프로세스가 임계 영역 진입을 무한정 기다리고 있고, 임계 영역에서 실행되는 프로세스가 진입 대기 중인 프로세스의 실행으로 인해서만 종료가 되야 하는 경우이다. 즉, Ready Queue와 임계 영역에 있는 모든 프로세스들이 서로만을 기다리며 아무것도 하지 않고 무한히 기다리는 상태를 말한다.