1. Low Level Solution

  • 이전까지 알아본 HW, SW, OS Supported 솔루션들은 low level에서의 솔루션
  • low level인 만큼 보다 세세한 부분까지 컨트롤 가능하지만 그만큼 구현과 사용이 여러움
  • 잘못 사용하면 에러가 발생하기 쉬움

 

 

2. High Level Solution

  • Monitor
    • 공유 데이터와 임계 영역(Critical Section)의 집합
    • 개체지향적인 관점으로 접근하는 동기화 기법

  • Path Expression
    • 프로세스의 실행에 있어 허용되는 시퀀스(순서)를 표헌하기 위한 방식
    • 프로세스 동기화 정책을 표현식으로 나타내는 것으로 복잡한 시스템의 설계오류를 방지할 수 있음

  • Serializer
    • 프로세스 실행의 직렬화, 즉 프로세스를 동시(concurrently)에 실행하지 않고 순차적으로 실행
    • 당연하게도 한순간에 하나의 프로세스만을 실행하기에 성능이 떨어진다.
    • 그러나 올바른 순서에 따라 순차적으로 프로세스를 수행할 경우에 얻을 수 있는 올바른 결과는
      동기화가 적절하게 이루어졌는지 확인하기 위한 기준점이 될 수 있다.

 

 

3. Monitor

  • 구조
    • 진입 큐(Entry Queue)
      • 모니터에 진입하려는 프로세스들의 대기열 
      • 모니터의 프로시저의 수(함수의 수)만큼 존재

    • 상호 배제(Mutual Exclusion)
      • 모니터 내에는 동시에 하나의 프로세스만이 존재할 수있음

    • 정보 은폐(Information Hiding)
      • 공유 데이터에는 모니터 내의 프로세스만이 접근할 수 있음

    • 조건 큐(Condition Queue)
      • 모니터 내의 특정 이벤트를 기다리는 대기열

    • 신호 큐(Signaler Queue)
      • signal 명령을 실행한 프로세스가 신호를 보내기 위해 잠시 들어가는 대기열

  • 모니터를 사용한 자원 할당 문제의 해결
    // 자원 요청 프로시저
    void request() {
        // 자원이 없을 경우 자원이 생겼다는 신호가 올 때까지 대기
        if(!R_Available)
            R_Free.wait();
        
        // 자원이 있을경우 가져감
        R_Available = false;
    }
    
    
    // 자원 반납 프로시저
    void release() {
        // 자원 반납 후 조건 큐에서 대기중인 프로세스를 깨우기 위해 시그널을 보냄
        R_Available = true;
        R_Free.signal();
    }
    • 공유자원 R과 그 자원을 요청하는 함수(request)와 반납하는 함수(release)가 있을 때
      자원을 요청/반납하는 여러 프로세스들의 동기화를 구현

    • 기본적인 방식은 세마포어 등과 크게 다르지 않지만 객체지향적인 방식으로 접근하는 것으로
      더 직관적이고 구현이 쉬움

    • 생산자-소비자 문제나 Reader-Writer 문제 등도 모니터를 사용하여 보다 쉽게 해결 가능

  • high level solution인 만큼 사용이 쉽고 에러발생의 가능성이 낮음
  • 프로그래밍 언어에서 이를 지원해야만 사용할 수 있음

  • C#, C++, Java 등의 언어가 모니터 클래스를 지원

+ Recent posts