나의 브을로오그으

#16. 모니터(Monitors) 본문

Computer Science/운영체제

#16. 모니터(Monitors)

__jhp_+ 2022. 8. 30. 08:33

모니터

 

- 모니터(Monitor)

  * 세마포어 이후 프로세스 동기화 도구

  * 세마포어 보다 고수준 개념

- 구조

  * 공유자원 + 공유자원 접근함수

  * 2개의 queues; 배타동기 + 조건동기

  * 공유자원 접근함수에는 최대 1개의 쓰레드만 진입

  * 진입 쓰레드가 조건동기로 블록되면 새 쓰레드 진입가능

  * 새 쓰레드는 조건동기로 블록된 쓰레드를 깨울 수 있다.

  * 깨워진 쓰레드는 현재 쓰레드가 나가면 재진입할 수 있다.

 

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

  * 배타동기: synchronized 키워드 사용하여 지정

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

class C {
  private int value, ...;
  synchronized void f() {
     ...
  }
  synchronized void g() {
      ...
  }
  void h() {
      ...
  }
}

value를 공통변수라고 생각하고 배타동기 메서드 f(), g()에서 이 공통변수에 연산을 하는데,

하나의 쓰레드에서 f() 메소드에 접근하게 되면 다른 쓰레드에서는 f()나 g() 메서드에 접근이 불가능하다. 왜? 배타동기로 작성된 메서드이기 때문에 한번에 하나의 쓰레드만 접근을  허용한다. h()는 일반 메서드이기 때문에 다른 쓰레드에서 접근하는데에 아무 문제가 없다.

 

조건 동기의 경우 wait() 메서드를 호출함으로써 conditional synchronization을 위한 queue에 갇히게 하고, notify()나 notifyAll()을 통해 조건동기를 위한 queue에서 빼낸다.

 

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

synchronizaed {
    Critical-Section
}

- 예제 : BankAccount Problem

(세마포어를 이용한 상호배타 동기화를 할 때에는 initial value값을 1로 설정하고, 나오고 들어갈때 acquire(), release() 를 사용해야 했다. 번거롭다. 그런 의미에서 Monitor를 사용한 배타동기가 편리하다.

 

- 일반적 사용 (2): Ordering

P1 P2
  wait()
S1 S2
notify()  

- 예제 : BankAccount Problem

- 입금 먼저 (= Parent 먼저)

- 출금 먼저 (= Child 먼저)

- 입금, 출금 (P, C, P, C)

 

 

전통적 동기화 예제

- Producer and Consumer Problem

  * 생산자-소비자 문제

  * 유한버퍼 문제

- Readers-Writers Problem

  * 공유 데이터베이스 접근

- Dining Philosopher Problem

  * 식사하는 철학자 문제