Monitors (모니터)

이찬영·2021년 8월 18일
0

OS

목록 보기
14/35

Monitors (모니터)

이전 방식들의 문제점

세마포어나 뮤텍스를 사용하더라도 프로그래머의 실수로 인해 상호 배제가 지켜지지 않거나, 데드락이 발생할 수 있다.

모니터란?

모니터는 추상화된 데이터 형이다(Abstract Data Type). 모니터는 내부에 사용할 변수와 함수를 선언하고 선언된 변수와 함수는 모니터 지역 내에서만 사용 가능하다.

모니터 의사 코드

monitor monitor_name{
	/* shared variable declarations */
	function P1(...){}
	function P2(...){}
    ...
	function Pn(...){}
    
    initialization_code(...){}
}

위의 의사코드만으로는 동기화 기법을 모델링하는데 충분하지 않다. 이것을 위해 우리는 condition이라는 struct로 동기화 기법을 제공할것이다. condition 변수에서 호출될 수 있는 연산은 wait(), signal()이다. wait() 연산은 호출한 프로세스는 다른 프로세스가 signal()을 호출할 때까지 일시 중지 된다. signal() 연산은 정확히 하나의 일시 중지 프로세스를 재개한다. 만약 중지된 프로세스가 없다면 아무런 연산을 하지 않는다. (세마포어와 차이점은 세마포어의 signal의 연산은 항상 세마포어 상태에 영향을 준다.)

// 잘 이해가 안됨 이 부분

  • signal and wait : signal을 호출하고 대기한다. 기다리고 있던 다른 프로세스가 수행되도록 한다.
  • signal and continue : signal을 호출하고, 내가 먼저 실행된 뒤 sleep()하여 다른 프로세스가 수행되도록 한다.

세마포어를 이용한 모니터 구현

각 모니터 마다 mutext라는 이진 세마포어를 정의하고 초기값을 1로 한다.

프로세스는 모니터로 들어가기 전에 wait(mutext)를 실행하고 모니터를 나온 후에 signal(mutex)을 실행한다.

모니터 구현시 signal-and-wait 기법을 사용한다. 내가 signal()을 호출한 프로세스라면 다음 프로세스가 모니터를 떠날때까지 기다리거나 다른 조건을 기다려야 하므로 next라는 이진 세마포어를 하나 추가하고 0으로 초기화 한다. signal을 호출한 프로세스는 자신을 중단시키기 위해 next를 사용할 수 있따.

wait(mutex);
	...
	함수 구현
	...
if (next_count > 0) signal(next);
else signal(mutex);

이제 condition 변수를 세마포어로 구현하는 방법을 보겠다. 각 condition x마다 x_sem이라는 이진 세마포어와 x_count라는 정수형 변수를 정의하고 둘다 0으로 초기화 해준다. x.wait()연산은 아래와 같다.

x_count++;
if (next_count > 0) signal(next);
else signal(mutex);
wait(x_sem);
x_count--;

x.signal() 연산은 아래와 같다.

if (x_count > 0){
      next_count++;
      signal(x_sem);
      wait(next);
      next_count--;
}

모니터 내에서 프로세스 수행 재개

signal() 연산을 수행했을때 일시 중지된 프로세스 중 어떤 프로세스를 다시 수행할것이냐가 문제이다. 가장 간단한 방법은 FCFS가 있으며 우선순위에 따라서 결정하도록 구현할 수 도 있다. 예를 들어 wait(time)과 같이 우선순위를 파라미터로 추가하여 스케쥴링을 할 수 있다.

0개의 댓글