[OS] Operating System - Synchronization Tools - Monitor

2024. 2. 1. 20:35CS/OS

[OS] Operating System - Synchronization Tools - Monitor

 

저번에는 뮤텍스 락과 세마포어에 대해 알아보았다면 이번에는 monitor에 대해 정리를 해보려고 한다. 

  • 모니터
    • 스레드가 상호배제를 가짐과 동시에 특정 조건이 충족될 때까지 대기(block)할 수 있게 하는 동기화 구조

 

Monitor

 

 위에서 간단히 정리한 개념에서 더 알아보았다. 단순히 해당 내용만 보면 세마포어와는 무슨 차이점이 있는지 모를 수 있다.

 

 세마포어의 경우 편리하고 효과적으로 동기화를 해결한다. 다만 timing error가 발생할 수 있다. 이때 timing error는 특정한 실행 순서가 발생할 경우 타이밍 에러가 발생할 수 있으나, 해당 실행은 항상 일어나는 것이 아니기에, 해당 에러를 감지하기 힘들다.
 모든 프로세스가 1로 초기화된 이진 세마포어의 경우, 다음과 같은 순서를 가진다

  1. 각 프로세스는 임계구역-CS에 들어가기 전에 대기 상태로 전환 - wait()
  2. 임계 구역에서 할당된 작업을 진행
  3. signal을 호출하면서 진행이 된다.

다만 해당 순서가 지켜지지않는 경우 두 개의 프로세스가 동시에 임계구역에 있는 상황이 생길 수 있으며 이는 세마포어의 상호 배제를 위반한다.

잘못된 순서들

이러한 문제들을 방지하기 위해 고수준 언어의 구조를 사용하며 이것이 바로 모니터이다. 모니터는 프로세스나 스레드 간의 동기화를 위한 고수준의 추상화된 동기화 ADT이다. 이는 상호배제를 제공하는 하나의 데이터 타입이다. 

모니터 구조

 

  • 뮤텍스 
    • 임계 구역에 진입하려면 필요한 부분, mutex lock을 의미한다. 
    • 해당 뮤텍스 락을 얻지 못한 스레드는 큐에 들어간 후 대기 상태로 전환, 후에 락이 반환되면 락을 획득하여 실행 
  • condition variable(s)
    • 특정 조건의 충족을 기다리는 스레드들을 위한 대기 메커니즘이다. 이때 조건 변수는 동기화 과정을 더 세밀하게 제어할 수 있게 해 주며, 복잡한 조건에서 스레드 간의 협업을 가능하게 한다. 
    • waiting queue : 조건이 충족되길 기다리는 스레드들이 대기 상태로 기다리는 곳
    • wait() : 스레드가 자기 자신을 waiting queue에 넣고 대기 상태로 전환
    • signal() : waiting queue에서 대기 중인 스레드 중 하나를 깨움

Java의 경우 모니터를 비슷하게 구현해서 사용을 하고 있다. 이때 자바의 모니터의 경우 알아야 하는 키워드가 있는데 바로 다음과 같다.

  • Synchronized 
    • 임계영역에 해당되는 코드 블록을 선언할 때 사용하는 자바 키워드
    • 임계 영역에 접근할 때는 모니터락을 획득해야 진입이 가능
    • 모니터락을 가진 객체 인스턴스는 따로 지정이 가능
      • 좌측의 이미지를 보면 객체가 들어오고 해당 객체의 경우 옆에 synchronized 키워드가 존재한다
      • 해당 키워드를 통해 들어오는 객체는 모니터락을 가지게 된다
    • 메서드에 해당 키워드를 선언하면 메서드 코드 블록이 임계영역으로 지정됨
      • 모니터락을 가진 객체 인스턴스는 this 객체 인스턴스이다.
  •    wait(), notify() method
    • Object 클래스에 선언된 모든 자바 객체가 가진 메서드
    • 역할은 이전에 작성된 역할과 동일하다