운영체제 - 16

KOCW 운영체제 16강

양희재 교수님 강의를 듣고 쓴 글입니다.


Monitor

Semaphore는 오래된 동기화 도구이다. Monitor는 이후에 나온 java 프로세스 동기화 도구로써 보다 더 고수준의 개념이다.


Semaphore

os16_1


Monitor

os16_2

  1. 대기하고 있던 thread 진입. 공통 자원에 접근하려는 method에 접근. 1개의 thread만 접근할 수 있게 mutual exclusion 보장. 나머지는 mutual exclusion Queue에 대기 중.
  2. 진입한 해당 thread가 wait()을 호출하면, blocked. Conditional Synchronization Queue 에 들어간다. 이제 새로운 thread가 진입 가능해진 것이다.
  3. mutual exclusion Queue에 있던 새로운 thread가 진입.
  4. 진입한 새로운 thread가 notify()를 호출하면 아까 blocked 된 thread를 깨울 수 있다. 따라서 현재 새로운 thread가 다시 나가게 되면 깨워진 이전 thread가 재진입하게 된다.

Semaphore보다 복잡해 보이지만, 그래서 더 사용하기 편하다.



Semaphore vs Monitor

  1. Mutual Exclusion

    • Semaphore

      void run() {
        // ...
        semaphore.acquire();
        // Critical Section
        semaphore.release();
        // ...
      }
      


    • Monitor

      synchronized void run() {
        // Critical Section
      }
      

    둘의 차이가 확연히 보인다. Semaphore는 매번 acquire(), release()를 호출해줘야 하기에 번거롭고, 복잡해질 수 있다. 그러나 Monitor는 키워드 1개만 쓰면 되기에 더욱 편하다.


  2. Ordering

    os16_3

    process1process2보다 먼저 실행하고 싶을 때 위와 같이 하면 된다. Semaphore를 사용하게 되면 permit 수도 신경써야 하고, acquire(), release()도 해줘야 한다. 그러나 Monitorwait(), notify()와 동기화 키워드로 쉽게 구현할 수 있다.


자세한 코드는 여기서 볼 수 있다.