(OS) 상호 배제 모니터링

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.

이번 포스팅에서는 상호 배제의 방법으로 Hoare(Tony Hore)의 모니터 방법과 Lampson/Redell의 모니터 방법을 정리해 보겠습니다.

이전 게시물은 운영 체제에서 공유 리소스에 대한 상호 배제 방법으로 세미포어 사용을 요약했습니다. Semiphores는 프로세스 간의 상호 배제 및 협력을 보장하는 데 사용되는 강력하고 유연한 프리미티브이지만 구현하기 어렵고 모듈화되지 않습니다. 이 문제를 해결하는 방법으로 ‘Tony Hore’는 ‘모니터’를 제안했습니다.

1. 모니터

모니터는 프로그래밍 언어 수준에서 제공되는 구성으로 세마포어와 동일한 기능을 제공합니다. 모니터의 개념은 Concurrent Pascal 및 Java와 같은 다양한 언어로 구현됩니다.

Hoare의 신호 기반 모니터

  • 로컬 변수는 모니터 프로시저를 통해 액세스할 수 있습니다. 즉, 외부에서 변수에 직접 액세스할 수 없습니다.
  • 프로세스는 모니터의 프로시저 중 하나를 호출하여 모니터에 들어갑니다.
  • 한 번에 하나의 프로세스만 모니터에 존재할 수 있습니다. 즉, 모니터가 이미 사용 중이면 다른 프로세스는 모니터가 사용 가능해질 때까지 기다려야 합니다. (상호 배제)
  • 동기화할 모니터 조건 변수제공합니다. 조건 변수는 모니터 내부에 포함되며 모니터 내부에서만 액세스할 수 있습니다.
  • cwait(c): 조건 c에서 호출 프로세스를 일시 중지합니다. 이제 모니터를 다른 프로세스에서 사용할 수 있습니다.
  • csignal(c): cwait(c)에 의해 중지된 프로세스의 실행을 재개합니다. 중지된 프로세스가 여러 개인 경우 그 중 하나를 선택합니다. 중지된 프로세스가 없으면 신호는 아무 작업도 수행하지 않습니다.

2. 모니터링 프로세스

  • 프로세스 로컬 변수 x와 관련된 프로시저 호출
  • 프로세스 B는 모니터 진입점에서 진입을 시도합니다.
  • 모니터는 프로세스 A에서 이미 사용 중이므로 대기 대기열(x)에서 차단됩니다.
  • 프로세스가 로컬 변수 x와 관련된 절차를 완료하면 cSignal(x)를 호출합니다.
  • 이전에 중단된 프로세스 C가 있으면 프로세스 블록 큐에서 호출되어 계속 진행됩니다.


그림 1

3. 기존 모니터 모델의 단점

  • cSignal을 호출한 프로세스에 의해 호출됨 그 후, 아직 해야 할 일이 있다면 2개의 추가 프로세스 컨텍스트 교환이것은 필수입니다. 호출 프로세스를 일시 중지하고 모니터를 다시 사용할 때 재개하는 데 한 번 필요합니다.
  • 스케줄러는 cSignal 호출로 인해 cWait()ing 프로세스가 블록 대기열에서 벗어나 실행되도록 하여 다른 프로세스가 모니터에 진입하는 것을 방지해야 합니다. 새로운 프로세스가 계속해서 모니터에 진입하면 블록 큐의 프로세스가 대기 상태로 남아 있을 수 있습니다.

처음에는 스케줄러가 cSignal 호출로 인해 cWait()ing 프로세스가 블록 대기열에서 벗어나 실행되도록 하여 다른 프로세스가 모니터에 진입하지 못하도록 하는 방법에 대한 세부 사항을 이해하지 못했습니다.

그러나 위에서 설명한 프로세스에 예를 하나 더 추가하고 생각한 결과 이해할 수 있었습니다.

  • 리소스 소비를 담당하는 프로세스 A가 모니터에 진입 -> 조건 a에 대해 cWait(a)로 모니터를 떠나 블록 큐로 이동
  • 리소스 소비를 담당하는 프로세스 C는 대기 대기열의 모니터에 진입 -> 조건 a에 대해 cWait(a)로 모니터를 떠나 블록 대기열로 이동
  • 현재 블록 대기열(A, C) 순서
  • 리소스 추가를 담당하는 프로세스 D가 대기 큐에서 모니터로 진입 -> 조건 a를 만족하여 cSignal(a) 호출
  • 대기 큐에 프로세스 E가 있더라도 블록 큐에 있는 A는 모니터에 들어가 cWait() 이후의 프로세스가 수행될 수 있도록 합니다.

4. Lampson 및 Redell의 모니터 모델

Tony Hoare의 모니터 모델의 단점을 극복하기 위해 Lampson과 Redell은 또 다른 모니터 모델을 개발했습니다.

  • csignal() -> cnotify() 소개를 통해 각 조건 변수에 대한 최대 대기 시간을 설정할 수 있습니다.
  • 주요 변경 로직은 if로 설정된 조건을 while으로 대체하는 소스입니다. while( count == N) cwait(notfull);
  • 조건 변수에 감시 타이머를 설정하여 최대 대기 시간 동안 대기한 프로세스는 다시 준비 상태로 전환됩니다.그것을 만들 수 있습니다
  • 모든 대기 프로세스는 cbroadcast를 추가하여 깨울 수 있습니다. 있습니다. 이러한 효과는 메모리(10)가 확보되고 메모리를 충족하는 특정 프로세스만 실행될 필요가 있을 때 사용 가능한 모든 프로세스를 깨우면 달성할 수 있습니다.

이것은 내가 while() 부분을 이해하지 못하는 곳입니다. while 루프를 사용하면 무한 루프가 발생하는지 궁금합니다. 하지만 이 부분은 아주 명료하게 풀 수 있는 문제였다. 실제 블록 대기열로 이동하면 대기열에서 빼지 않는 한 CPU에서 실행되지 않습니다. cnotify나 cbroadcast를 호출해야만 queue에서 빠져나와 할당이 가능하며, 리소스에 대한 조건이 다시 while 루프에서 처리되기 때문에 리소스에 대한 상호 배제와 동기화가 안정적으로 처리된다.당신은 할 수 있습니다.

이것으로 상호 배제 모니터에 대한 기사를 마칩니다.

읽어 주셔서 감사합니다.!!!

출처(그림 1): http://blog.sby.net/%EC%83%81%ED%98%B8-%EB%B0%B0%EC%A0%9C-%EA%B8%B0%EB%B2%95-% EB%AA%A8%EB%8B%88%ED%84%B0-모니터/

데이터 출처: OS 8판 내부 구조 및 설계 원칙