공유자원을 어느 시점에서 단 한 개의 프로세스만이 사용할 수 있도록 하며, 다른 프로세스가 공유자원에 대하여 접근하지 못하게 제어하는 기법으로, 여러 프로세스가 동시에 공유 자원을 사용할 때 각 프로세스가 번갈아 가며 공유 자원을 사용하도록 하는 것으로 임계 구역을 유지하는 기법이다.
공유자원은 시스템안에서 각 프로세스, 스레드가 함께 접근할 수 있는 메모리, 파일, 데이터, 모니터 등의 자원이나 변수 등을 의미한다. 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 경쟁상태에서는 동시에 자원에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태이다.
임계영역은 둘 이상의 프로세스, 스레드가 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역을 말한다. 임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 있으며, 이 방법 모두 상호배제, 한정대기, 융통성 이라는 조건을 만족한다. 이 토대가 되는 매커니즘은 잠금(locking)이다. 예를들면, 화장실을 A라는 사람이 사용중일때 문을 잠가서(locking) A가 나오면 B가 화장실을 쓰는 방법이다.
뮤텍스는 프로세스나 스레드가 공유자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금을 해제하는 객체이다. 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근 할수 없다. 또한, 임계 구역에 하나의 스레드만 들어갈 수 있다. (화장실 열쇠의 개수가 하나라고 생각하자)
세마포어는 일반화된 뮤텍스로 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리한다. wait()은 자신의 차레가 올때까지 기다리는 함수이며, signal()은 다음 프로세스로 순서를 넘겨주는 함수이다. 프로세스나 스레드가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스나 스레드가 공유 자원을 해제하면 세마포어에서 signal() 작업을 수행한다. 또한, 세마포어는 임계 구역에 여러 스레드가 들어갈 수 있다. counter를 두어서 동시에 자원에 접근할 수 있는 허용 가능한 스레드 수를 제어한다. (화장실 열쇠의 열쇠의 개수를 정할 수 있다)
모니터는 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 인터페이스만 제공한다. 모니터는 모니터 큐를 통해 공유자원에 대한 작업들을 순차적으로 처리한다.