CS/운영체제
Monitor
이충무
2022. 9. 20. 22:10
모니터란?
- 기본적으로 뮤텍스, 세마포어, 모니터는 상보 배제, 한정 대기, 융통성이란 조건을 만족합니다.
- 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
- 한정 대기 : 특정 프로세스가 영원히 임계영역에 들어가지 못하면 안 된다.
- 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다.
- 모니터는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고(캡슐화) 해당 접근에 대해 인터페이스(프로시저)만 제공합니다.
- 모니터는 모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리합니다.
- 모니터는 세마포어보다 구현하기 쉬우며 모니터에서 상호 배제는 자동인 반면에, 세마포에서는 상호 배제를 명시적으로 구현해야하는 차이점이 있습니다.
- 예시로 Java의 경우 synchronized 키워드가 있습니다.
현대의 운영체제는 임계영역 동기화(상호배제 방법)으로 세마포, 뮤텍스보다는 모니터를 많이 사용합니다. 모니터는 2개의 큐(상호베타 큐, 조건동기 큐)로 구성되어집니다.
- 상호배타 큐는 말그대로 공유 자원에 하나의 프로세스만 진입하도록 하기 위한 큐입니다.
- 조건동기 큐는 이미 공유자원을 사용하고 있는 프로세스의 wait() 호출을 통해 조건동기 큐로 들어갈 수 있습니다.
그림을 보면 이해가 쉽습니다.
- 왼쪽 큐에 자원이 필요한 쓰레드들을 담아, 한개씩 임계영역 메모리를 사용하게 해줍니다.
- 임계영역에 접근하였으나 I/O등으로 아직 데이터가 준비되지 않아 해당 쓰레드가 기다려야 하는 경우 wait()으로 오른쪽 큐에 들어갈 수 있습니다. 이는 쓰레드를 종료하는게 아니라 잠시 기다리게(block)하는 개념입니다.
- 오른쪽 큐(조건동기)에 들어가있는 다른 쓰레드에서 notify()로 깨워줄 수 있습니다. 다만 이미 임계영역을 사용중이거나 앞에 다른 쓰레드가 대기중이라면 notify()를 호출 했다해서 바로 실행되는건 아닙니다.