프로세스 동기화 도구 - 모니터(Monitor)
Programming/운영체제

프로세스 동기화 도구 - 모니터(Monitor)

1. 모니터(Monitor)

모니터란 세마포 이후의 프로세스 동기화 도구이다. 세마포보다 한단계 높은 고수준 개념이다.

 

1) 모니터의 구조

모니터는 공유자원 + 공유자원 접근함수로 이루어져 있다.

모니터에는 2개의 큐가 존재한다. 하나는 배타동기를, 또하나는 조건동기를 처리한다.

 

공유자원 접근함수에는 최대 1개의 쓰레드만 진입 가능하다.

진입한 쓰레드가 조건동기로 블록되면 새 쓰레드가 진입할 수 있다.새 쓰레드는 조건동기로 블록된 쓰레드를 깨울 수 있다.(notify())깨워진 쓰레드는 현재 쓰레드가 나가면 재진입할 수 있다.

모니터의 구조


2. 자바 모니터

자바의 모든 객체는 모니터가 될 수 있다.

- 배타동기 : synchronized 사용하여 지정

- 조건동기 : wait(), notify(), notifyAll() 메소드 사용

 

자바 모니터 예시

하나의 쓰레드만 공유자원 접근함수에 접근할 수 있다. 즉, 한 쓰레드가 f() 메소드를 쓰고있다면, 다른 쓰레드는 f() 또는 g()에 접근할 수 없다.

 

1) 일반적 사용(1) : Mutual exclusion

모니터를 이용해 한번에 하나의 쓰레드만 공유자원을 이용하게 만들 수 있다. 단지 synchronized를 메소드 앞에 붙이면 된다.

예제 : BankAccountProblem

 

2) 일반적 사용(2) : Ordering

모니터를 이용해 어느 메소드를 먼저 실행할지 설정할 수 있다.

BankAccountProblem을 예로 들면 다음 세가지 경우가 있다.

- 항상 입금 먼저(=Parent 먼저)

- 항상 출금 먼저(=Child 먼저)

- 입출금 교대로(P-C-P-C ...)

 

항상 입금 또는 출금을 먼저 실행하려면 다음과 같이 notify(), wait() 메소드를 이용하면 된다.

항상 입금 먼저(=Parent 먼저)

입출금을 교대로 나오도록 설정하려면 다음처럼 설정하면 된다.

입출금 교대로(P-C-P-C ...)