기어가더라도 제대로

[운영체제-김덕수교수님] 프로세스 상호배제, 동기화(7/7) - Monitor 본문

CS/운영체제

[운영체제-김덕수교수님] 프로세스 상호배제, 동기화(7/7) - Monitor

Damagucci-juice 2022. 8. 6. 08:11

Semaphore 를 비롯한 운영체제 레벨의 동기화, 상호배제 로직은 복잡하고 쓰기가 어렵다.

그래서 사용이 쉬운 언어 레벨의 상호배제와 동기화를 배워보자.

High-level Mechanism

  • Monitor
  • Language-level constructs
  • Object-Oriented concept과 유사
  • 사용이 쉬움

‏‏‎ ‎

Monitor

  • 공유 데이터와 Critical section의 집합
  • Conditional variable
    • wait(), signal() operations

프로세스 상호배제, 동기화(7/7) - Monitor image

  • 한번에 한명만 들어올 수 있는 책방을 가정해보자.

‏‏‎ ‎

구조

  • Entry Queue(진입큐)
    • 모니터 내의 procedure(function) 수만큼 존재
  • Mutual exclusion
    • 모니터 내에는 항상 하나의 프로세스만 진입 가능
  • Information hiding (정보 은폐)
    • 공유 데이터는 모니터 내의 프로세스만 접근 가능
  • Condition Queue(조건 큐)
    • 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기
  • Signaler queue(신호 제공자 큐)
    • 모니터에 항상 하나의 신호제공자 큐가 존재
    • signal() 명령을 실행한 프로세스가 임시 대기

‏‏‎ ‎

모니터의 자원할당 문제

프로세스 상호배제, 동기화(7/7) - Monitor image

  • 자원 요청 명령
  • 자원 반납 명령

프로세스 상호배제, 동기화(7/7) - Monitor image

코드는 쉬운 편

프로세스 상호배제, 동기화(7/7) - Monitor image

이해는 어려운 편

  1. Pj 가 처음으로 "RequestR() 엔트리 큐"에 담긴다.
  2. R_available 이 Max_ 1 이라고 가정하면 현재는 0이며 비어 있으므로 RequestR()로 Pj 가 담긴다.
  3. Pj 가 리소스를 할당 받고 일을 처리한다.
  4. 그 사이 RequestR 엔트리 큐에 Pk 와 Pr 이 담긴다.
  5. Pk 와 Pr은 현재 리소스를 Pj 가 사용하고 있으므로 Condition_queue 에 가서 기다린다.
  6. 일을 마친 Pj 는 ReleaseR() 엔트리 큐에 담겼다가 releaseR() 로 간다.
  7. 그러면 현재 R_available 의 최대 허용 개수는 1개이므로 더 프로세스가 들어올 수 없다.(현재 Pj 가 있기 때문)
  8. 그러므로 잠시 Pj 가 signaler queue 로 가서 R_available 을 1로 만든다.
  9. signaler queue 에서 condition queue 에 담긴 Pk 를 깨워서 RequestR() 로 보냈다가 R 를 할당한다.(이게 "signal()"인가?)
  10. 그럼 다시 R_available 이 1 이 되는데 signaler queue 에 담겼던 Pj 가 미처다 못한 일을 처리하기 위해 releaseR() 에 담겨서 일을 처리하고 끝난다.

‏‏‎ ‎

생산자와 소비자 문제

프로세스 상호배제, 동기화(7/7) - Monitor image

말하는 대로 짜면 되긴 한다.

고민해보고 아래 코드를 보자.

프로세스 상호배제, 동기화(7/7) - Monitor image

Reader-Writer Problem

  • reader/writer 프로세스들간의 데이터 무결성 보장 기법
  • writer 프로세스에 의한 데이터 접근 시에만 상호 배제 및 동기화 필요함
  • 모니터 구성
    • 변수 2개
      • 현재 읽기 작업을 진행하고 있는 reader 프로세스의 수
      • 현재 writer 프로세스가 쓰기 작업을 진행 중인지 표시
    • 조건 큐 2개
      • reader/writer 프로세스가 대기해야 할 경우에 사용
    • 프로시져 4개
      • reader(writer) 프로세스가 읽기(쓰기) 작업을 원할 경우에 호출
      • reader(writer) 프로세스가 읽기(쓰기) 작업을 마쳤을 때 호출

프로세스 상호배제, 동기화(7/7) - Monitor image

Dining philosopher problem

  • 5명의 철학자
  • 철학자들은 생각하는 일, 스파게티 먹는 일만 반복함
  • 공유자원: 스파게티, 포크
  • 스파게티를 먹기 위해서는 좌우 포크 2개 모두 들어야함

프로세스 상호배제, 동기화(7/7) - Monitor image

철학자를 프로세스로 대입해보면 된다.

프로세스 상호배제, 동기화(7/7) - Monitor image

프로세스 상호배제, 동기화(7/7) - Monitor image

프로세스 상호배제, 동기화(7/7) - Monitor image

  • 최초의 상태는 두개씩 쓸 수 있다.
  • 2개씩 쓸 수 없으면 기달린다.
  • 먹다가 다먹으면 옆에 있는 친구를 깨워준다.

‏‏‎ ‎

장점

  • 사용이 쉽다
  • Deadlock 등 error 발생 가능성이 낮음

단점

  • 지원하는 언어에서만 사용 가능
  • 컴파일러가 OS를 이해하고 있어야함
    • Critical Section 접근을 위한 코드 생성

‏‏‎ ‎

‏‏‎ ‎

Comments