[OS] Monitor(모니터)

2020. 4. 25. 18:08Programming/CS

모니터

저번 포스팅에서 상세히 다루었던 세마포는 사실, 조금 오래된 동기화 도구였단 사실! 짜잔!

java에서는 특히나 이 monitors를 동기화 도구로 사용하고있다. 세마포가 어셈블리 수준이었다면 monitor는 high level language수준이라고 볼 수 있다!

 

이미지 출처 : https://user-images.githubusercontent.com/34755287/54345852-3bd73680-4687-11e9-8c99-236870a019d9.png

 

  • 공유자원 + 공유자원에 접근하는 함수 + 2개의 Queue(배타동기, 조건동기)로 구성되어있다.
  • 최대 1개의 쓰레드만 공유자원접근함수에 들어갈 수 있고, 그 이상 들어가려고 하면 waiting해야한다.
    • mutual exclusion (Queue): 상호배타 - 많은 쓰레드가 있어도 오직 한 쓰레드만 접근할수있다
    • conditional synchronization (Queue) : 조건분기 - 블락되고 기다림
  • wait() : Thread가 이미 공유자원접근함수에 들어가있으면 block되고, 기다려야함
  • modify() : 아까 conditional Sync Queue에서 wait()하고있는 Thread를 깨워 다시 common variable 접근 함수를 실행하게끔 해줌 -> 새 쓰레드 진입 가능(새 쓰레드는 conditional Sync 로 block된 쓰레드를 깨울 수 있음)

 

자바 모니터

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

  • mutual exclusion : 세마포처럼 배타동기를 위해 acquire() 를 호출할 필요 없이, synchronized 키워드를 사용하여 지정한다
  • conditional Synchronization : wait()-큐에 갇혀라!, notify()-깨워라, notifyAll()-다깨웟! 메서드를 사용한다
class C{
    private int commonVal;
    synchronized void f() {
        // f가 호출되면 g는 호출되지 못함 (mutual exclusion해야하니까)
        ...
    }
    synchronized void g() {
        ...
    }
    void h() {
        // 공통변수를 업데이트 하는 함수가 아니라는 뜻 (다른 common value를 사용하는 쓰레드와 같이 실행가능)
        ...
    }
}

 

semaphore vs monitor

동기화에서 중요한것은 1. mutual exclusion해야하기때문(critical Section에는 오직 하나만)이었다.

  • 세마포(semaphore) : critical Section 앞에서 semaphore.acquire(), 나가면서 semaphore.release() 해줬었음. 그리고 세마포의 초기값은 1로 두었음
  • 모니터(monitor) : synchronized 만 붙여주면 됨 !

사용이 간단해졌다 ㅎㅎ.

2.로는 순서 정하기였다.

  • 세마포(semaphore) : acquire(), #기록, 비교하는과정거쳐 release()
  • 모니터(monitor) : wait(), notify()

좀 더 깔끔해지고 수월해졌다!