세마포어(Semaphore)는 상호 배제, 동기화, 임계 영역 등 다중 프로세스 간 동기화 문제를 해결하기 위해 사용되는 동기화 도구를 말한다.
세마포어는 wait()과 signal()이라는 두 개의 연산으로 이루어져 있으며 wait() 연산은 세마포어 값을 감소시키고, 값이 0보다 작아지면 해당 프로세스는 블록된다. signal() 연산은 세마포어 값을 증가시키고, 이를 기다리는 다른 프로세스가 있다면 하나를 깨우게 된다.
문제점: 만약 모든 철학자가 배가고파 자기 오른쪽에 있는 젓가락을 집는다면 모두가 밥을 먹지 못 하고 기다려야 하는 (교착 상태)상황이 일어나게 된다.
<해결법>
철학자의 수를 줄인다 (프로세스의 수 감소)
한 철학자가 젓가락 두 개를 모두 집을 수 있을 때만 젓가락을 집도록 허용한다. (임계구역 안에서만 작업 - 모니터)
비대칭 해결안: 홀수 번호의 철학자는 왼쪽 젓가락 먼저 집고 짝수 번호의 철학자는 오른쪽 젓가락을 먼져 집도록 하여 모두가 젓가락을 하나씩만 잡은 상황을 방지한다. (알고리즘 적 해결)