모니터는 프로세스와 스레드 동기화를 간소화하는 고수준 동기화 메커니즘이다.
락(lock)을 기반으로 구축되었으며 주로 자바와 같은 멀티스레딩 시스템에서 사용된다.
- 공유 변수와 해당 변수를 조작하는 함수들을 그룹화하는 클래스/모듈과 유사
- 내부에서는 한 번에 하나의 스레드만 실행될 수 있으므로 자동적인 상호 배제가 보장 (Mutex를 사용하여 구현)
- 조건 변수를 사용하여 특정 조건에서만 스레드가 실행되도록 설정 가능
- Java 모니터는 클래스와
synchronized메서드를 사용하여 구현
운영 체제에서 모니터는 간단히 말해 변수 선언, 조건 변수, 다양한 프로시저(함수) 및 프로세스 동기화에 사용되는 초기화 코드 블록을 포함하는 클래스이다.
핵심 구성요소
- Entry Queue: 모니터에 들어가기 위해 기다리는 스레드
- Critical Section: 현재 모니터를 획득한 스레드가 실행되는 영역
- Condition Queue: 특정 조건이 만족되기를 기다리는 스레드
모니터 구현
- 모니터링 기능은 운영 체제에서 직접 구현되는 것이 아니라 프로그래밍 언어 수준에서 구현됩니다.
- Java에서 모니터와 유사한 동작은
synchronized키워드를 사용하여 구현되며, 이를 통해 모니터 내부에서는 한 번에 하나의 스레드만 실행될 수 있습니다. - 모니터는 공유 데이터(핵심 리소스)와 해당 데이터에 접근하거나 수정하는 작업을 모두 캡슐화합니다.
- 상호 배제는 자동으로 적용됩니다. 프로그래머가
wait()및signal()을 명시적으로 호출해야 하는 세마포어와는 다릅니다. - 동기화는 동기화 메서드 또는 동기화 블록을 통해 적용할 수 있습니다.
- 조건 변수는 스레드 대기 및 신호 처리를 제어하는 데 사용됩니다.
wait(),notify(),notifyAll()메서드는 프로세스 간 조정을 제공합니다.
상호 배제 제어를 위한 동기화
- 인터페이스를 위한 큐가 존재 (entry queue)
- 공유자원에 접근하고자 하는 프로세스를 큐에 삽입
- 큐에 삽입된 순서대로 공유 자원 이용 (하나의 프로세스/스레드만 접근 가능)

실행 순서 제어를 위한 동기화
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는
wait를 통해 실행을 중단 (wait queue로 이동) - 특정 프로세스가 실행될 조건이 충족되었을 때에는
signal를 통해 실행을 재개

경쟁조건에 대한 처리
프로세스가 실행될 조건에 부합하다면 Lock을 해제 후Wait Queue로 이동한다.
그 이후 모니터에 Lock을 지닌 프로세스가 없기에 Entry Queue에 있던 프로세스가 Lock 획득 후 모니터에 진입한다.
이후 실행 조건이 충족되어 signal(혹은 broadcast)를 호출하게 된다면 Wait Queue에 있던 스레드와 Entry Queue에 있는 스레드 중 어떤걸 먼저 실행해야 되는가를 결정해야 된다.
Signal and Wait
- 현재 모니터를 소유하고 있는 스레드가 wait() 을 실행하면 모니터 내부에서 자신을 일시 중단하고 Lock 을 해제한 후 Wait Set 에 들어간다.
- 깨우는 스레드가 notify() or notifyAll() 명령을 실행하면 Wait Set 에 있는 대기 스레드 중 하나 또는 모든 스레드를 깨우고 깨우는 스레드는 Lock 을 해제하고 대기한다.
- 대기에서 깨어난 스레드가 Lock 을 획득한 후 모든 작업을 마치고 Lock 을 해제하면 깨운 스레드가 Lock 을 획득한 후 계속 작업을 진행한다.
- 대기 스레드와 깨운 스레드 사이에 다른 스레드가 모니터를 소유할 수 없도록 원자적 실행이 보장되어야 한다.
Signal and Continue
- 현재 모니터를 소유하고 있는 스레드가 wait() 을 실행하면 모니터 내부에서 자신을 일시 중단하고 Lock 을 해제한 후 Wait Set 에 들어간다.
- 깨우는 스레드가 notify() or notifyAll() 명령을 실행하면 Wait Set 에 있는 대기 스레드 중 하나 또는 모든 스레드를 깨운다. 이때 일어난 스레드들은 Entry Set 으로 이동한다.
- 깨우는 스레드는 Lock 을 계속 유지하면서 모든 작업을 완료하고 Lock 을 해제하면 Entry Set 에 대기하고 있는 모든 스레드가 Lock 을 획득하기 위해 경쟁한다.
- 자바에서는 이 조건 변수 형식을 취하고있다.
출처 및 참고자료
https://www.geeksforgeeks.org/operating-systems/monitors-in-process-synchronization/
https://www.scaler.com/topics/monitor-in-os/
https://www.youtube.com/watch?v=4t8BennljZA
https://www.youtube.com/watch?v=4u13f9Umq7Y&t=1377s
https://devdebin.tistory.com/335#google_vignette