앞서 설명드린 동기화 도구들은 오래된 동기화 도구들이 많습니다. 현대에는 모니터(Monitor)라는 도구를 많이 사용합니다.
모니터는 동시 수행중인 프로세스 사이에서 추상 데이터의 안전한 공유를 보장하기 위한 High-Level 동기화 구조입니다. 공유 데이터에 접근하기 위해서는 모니터의 내부 프로시저(Procedure)를 통해서만 접근할 수 있도록 합니다.
세마포어와의 가장 큰 차이는 락을 직접 걸 필요가 없다는 것입니다. 락이 자동으로 관리됩니다. 세마포어는 직접 wait, signal을 사용하여 Race Condition을 해결해야 하지만 모니터는 자체적인 기능으로 해결할 수 있습니다.
모니터는 다음과 같은 구조입니다.
모니터는 공유 데이터 구조, 공유 데이터에 대한 연산을 제공하는 프로시저(Procedure), 현재 호출된 프로시저간의 동기화를 캡슐화한 모듈(Module)입니다.
프로세스가 공유 데이터를 사용하기 위해서는 모니터 내부의 프로시저를 통해야만 합니다. 그리고 동시에 한 프로세스나 스레드만 모니터에 들어갈 수 있습니다.
모니터에 진입하려고 했지만 이미 프로세스가 들어가 있어 진입하지 못한 프로세스들은 모니터 큐(Monitor Queue)에서 대기합니다. 프로세스가 모니터 내에서 대기할 수 있게 조건 변수(Condition Variable)가 사용됩니다.
조건 변수는 오직 wait, signal 연산으로 사용됩니다. 세마포어 변수와 비슷하지만 면수가 어떤 값을 가지진 않고 자신의 큐에 프로세스를 매달아서 sleep시키거나 큐에서 프로세스를 깨우는 역할만 합니다.