ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14. 모니터
    운영체제/운영체제 정리 2019. 12. 31. 00:57

    동기화의 또 다른 도구인 모니터는 세마포어 이후에 나왔다. 

     

    세마포어에 구조는 int value 하나와 큐 하나가 존재하고 acquire()과 release()

     

    를 통해 value를 감소하고 증가시키면서 0 미만이면 acquire()를 호출해 큐에 프로세스(스레드)

    를 갖히게 하고 0보다 크면 큐에 잡혀있는 프로세스(스레드)를 깨우는 방식이었다.

     

     

     

    모니터 역시 공유자원 + 공유자원 접근 함수가 존재한다.

     

    common variable과 common variable에 접근할 수 있는 함수들이다.

     

    그리고 두 개의 큐가 존재하는데  앞에 큐는 상호 베타를 위해 존재한다.

     

    즉 common variable에 접근할 수 있는 함수들이 있는데 이 메서드들에 접근하려면 한

     

    스레드만 접근할 수 있다는 뜻이다. 이미 다른 스레드가 접근하고 있다면 상호 베타를 위한

     

    큐에 들어가야 한다. 나머지 큐는 조건 동기(Condintional Synchronization)를 위한 큐이다.

     

     메서드에 들어온 스레드가 wait()라는 콜을 부르면 조건 동기 큐에 잡히게 된다. 

     

    갇히게 되면 새로운 스레드가 들어올 수 있다.

     

    새로운 스레드가 들어온 후에 notify()라는 콜을 해주면 갇혀있던 스레드는 나갈 수 있다.

     

     

    자바에서의 모니터를 알아보자

     

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

     

    모니터는 베타 동기와 조건 동기 모두 지원한다고 하였는데 자바에서 베타 동기는 메서드 앞에다가

     

    synchronized라고 만든다면 베타 동기를 만족하게 된다. 어느 한 스레드가 method1을 호출된다면 다른 스레드는

     

    method1이나 method2를 실행할 수 없다. 상호 베타가 이루어져야 하기 때문이다.

     

    method3은 공통 변수를 업데이트하는 함수가 아니기에 synchronized를 붙이지 않았고

     

    또 다른 스레드가 와도 아무 문제없다. 베타 동기는 간단히 메서드 앞 synchronized로 가능하다.

     

    1) Mutaul Exclusion 시

     

    즉 Mutual Exclusion을 할 때 임계 구역 안에는 오직 하나의 스레드만 들어올 수 있었는데

     

    세마포어를 할 적에는 임계 구역 전에 세마포어.acquire()을 임계 구역 후에 세마포어. release()

     

    를 붙여주었다. 그리고 세마포어 value에 초기값은 1로 두었다. 이는 기억하기에 조금 어려울

     

    수도 있는 반면 모니터는 메소드 앞에 synchronized만 붙여준다면 간단히 가능한 것이다.

     

    은행계좌 모니터 예시 )

     

    2) Ordering 시

     

    항상 s1이 실행되고 s2가 실행되게 하려면 어떻게 해야 할까?

     

    세마포어를 사용할 적에는 초기값 value를 0으로 아무도 못 들어가게 만들고 

     

     

    s2가 실행 시 acquire()로 큐에 갇히게 만드는 방식이었다. 역시 세마포어 초기값을 0으로

     

    만들어야 한다는 것과 acquire()과 release()를 따로 처리해 줘야 하는 불편함이 있다.

     

    모니터를 사용한다면 좀 더 수월 하게 가능하다.

     

     

    이제는 초기값 설정은 없고 wait()과 notify() 호출 만으로 가능하다.

     

    자바 은행 계좌 wait(), notify() 예시 )

    입금이 먼저 되도록

    withdraw 호출 시 처음 balance는 0이니 wait() 되고 deposit 후 notify() 실행 후에 깨워주게 된다

     

     

    세마포어는 조금 더 간단한 내부구조를 가지고 있고 모니터는 조금 더 복잡해 보이는 구조를

     

    가지지만 한결 더 사용하기에 편하다. 모니터는 이름이 따로 있지 않고 synchronized 메서드와

     

    공통 변수를 두는 형식을 모니터라 부른다.

    '운영체제 > 운영체제 정리' 카테고리의 다른 글

    16. 외부 단편화와 페이징  (0) 2020.01.10
    15. 메모리 낭비 방지  (0) 2020.01.05
    13. 교착상태 ( Deadlock)  (0) 2019.12.15
    12. 임계구역과 세마포어  (0) 2019.11.18
    11. 프로세스와 쓰레드  (0) 2019.11.11
Designed by Tistory.