학습일지

모니터

hj.choi 2022. 1. 26. 16:09

모니터란?

mutual exclusion을 보장하고, 조건에 따라 스레드를 wait 상태로 전환하게 해주는 하나의 동기화 기법이다.

모니터는 어떨 때 사용할 수 있을까?

모니터는 한 번에 하나의 스레드가 실행되어야 하며, 여러 스레드간의 협력이 필요할 때, 활용될 수 있다.

모니터의 구성요소

  • mutex
    • 임계 영역에서 상호 배제(mutual exclusion)을 보장하는 장치 (자세한 내용은 [저번 게시글](https://postwithmemory.tistory.com/22?category=1067725)을 참고하라.)
      • 따라서 임계영역에 진입하려면, mutex lock을 취득해야 한다. 여기서 락을 획득하지 못한 스레드는 일종의 큐에 들어가 대기(waiting) 상태로 전환한다.
      • 이후에, 락을 가진 스레드가 락을 반환하면, 기존에 큐에서 대기하고 있던 스레드 중 하나를 실행한다.
  • 하나 이상의 condition variable
    • 위 항목에서 이야기한 *일종의 큐* 를 의미한다. 'waiting queue'라고도 하고, 락을 기다리는 스레드들이 대기(waiting) 상태로 머문다.

Condition Variable의 주요 동작

  • wait
    • cv(앞으로, condition variable을 이렇게 줄이도록 하겠다.)의 주요 동작은 'wait'으로, 락을 얻지 못하고 기다려야하는 스레드가 대기 상태가 되었을 때, cv의 대기 큐에 넣고, 대기 상태로 전환한다.
  • signal
    • 대기 큐에서 대기중인 스레드 중 하나를 깨운다.
  • broadcast
    • 대기 큐에서 대기중인 모든 스레드를 깨운다.

그러면 자바의 모니터란?

'모니터'는 결국 mutex 락을 프로그래밍 언어와 같은 고수준 언어에서 관리하는 동기화 기법이라 할 수 있다. 따라서 자바의 모니터 역시 비슷한 관점에서 구현이 된 동기화 기법인데, 자바를 통해 동기화를 진행하는 프로그래머는 모니터를 직접 구현해서 사용하지 않고도 모니터 동기화를 활용할 수 있다.

자바 모니터의 특징

  • 자바는 객체 내부에 '모니터'를 하나 씩 갖추고 있다.
  • 자바는 모니터의 mutual exclusion 기능은 synchronized 키워드로 사용한다.
  • 자바 모니터는 하나의 condition variable을 가진다.
    • 자바 모니터의 condition variable은 세가지 동작을 제공한다.
      • wait
      • notify (signal)
      • notifyAll (broadcast)