강의 링크 : https://www.youtube.com/watch?v=AnYN-kbCbRI&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=18
0. 들어가기에 앞서
이번 포스팅에서 다룰 내용은 Monitor입니다.
이는, 앞에서 다룬 Low-level mechanisms(SW solution, HW solution, OS supported SW solution)과는 달리, Language-Level solution으로써 프로그래밍 언어적으로 상호배제를 해결하는 방법입니다.
그 동안 한 Low-level mechanisms들은 다음과 같은 특징이 있었습니다.
- Flexible : 다양하게 적용 가능하다
- Difficult to use : 구현이 복잡하다
- Error-prone: 구현이 복잡하기 때문에 logical error의 발생 확률이 높다
이와 달리 Language-Level Solution의 경우 프로그래밍 언어가 mutual exclusion을 지원해주는 것이기 때문에 사용이 쉽고 구현이 간단하다는 장점이 있습니다.
Monitor, Path expressions, Serializers, Critical regon, conditional critical region 등이 있지만 Monitor만 다루겠습니다.
1. Monitor란?
- 공유 데이터와 Critical section의 집합
- Conditional variable
- wait(), signal() operations
2. Monitor 구조

- monitor : 1명만 들어갈 수 있는 책 방이라고 생각.
- critical data : 책
- critical sections : 책 반납, 대출 같은 업무를 보는 카운터
- Entry queue (진입 큐)
- 한 명씩 책 방에 진입할 수 있게 해주는 queue
- 모니터 내의 procedure 수 만큼 존재
- procedure 수 == function마다 하나씩 존재한다고 생각하면 됨
- Mutual exclusion : 프로그래밍 언어가 보장해줌
- 모니터 내에는 항상 하나의 프로세스만 진입 가능
- Information hiding (정보 은폐)
- 책 방에 한 번에 한 명만 들어갈 수 있으므로 정보의 은폐성 존재
- 공유 데이터는 모니터 내의 프로세스만 접근 가능
- Condition queue(조건 큐)
- 조건을 기다리는 큐 == 대기실
- 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기
- Signaler queue (신호제공자 큐)
- 전화부스 같은거 (signal을 보내기 위해 잠깐 들어가는 공간)
- 모니터에 항상 하나의 신호제공자 큐가 존재
- signal()명령을 실행한 프로세스가 임시 대기
3. Monitor in Languages

- C#, C++, java에 monitor class가 존재함을 확인할 수 있음
4. 자원 할당

- R_Available : 책 (1권만 존재)
- entry queues for releaseR() : 자원 반납 entry queue
- entry queues for requestR() : 자원 요청 entry queue
- requestR() : 대출하는 공간
- releaseR() : 반납하는 공간
- condition queue R_Free : 책 대출하기 위해 대기하는 공간
- signaler queue : 전화부스 같은거 (대기실(condition queue R_Free)에 있는 애를 깨우는 거)

- 책 대출하러 옴
~R_Available: 책이 없나요?- 책이 없다면 기다림
- 책이 있다면 책 빌려감
- 책 반납하러 옴
R_Available <- true: 현재 책 상태 갱신 (빌릴 수 있다고 바꿔줌)R_Free.signal(): 대기실에 연락 (책 대출 가능 하다고)
5. 자원 할당 시나리오
0) initial monitor state
- 자원 R 사용 가능
- 현재 Monitor 안에 프로세스 없음

1) Monitor state1
- 프로세스 Pj가 모니터 안에서 자원 R을 요청

- 현재 상황 :
requestR()에Pj존재
2) Monitor state2
- 자원 R이 Pj에게 할당 됨
- 프로세스 Pk가 R 요청, Pm 또한 R 요청

- 현재 상황 :
entry queues for requestR()에Pj,Pk,Pm존재 requestR()에 있던Pj가R로 이동 : monitor에서 빠져 나옴entry queues for requestR()에 있던Pk가reqeustR()로 이동condition queue R_Free로Pk이동entry queues for requestR()에 있던Pm이requestR()로 이동condition queue R_Free로Pm이동
- 2~5는 현재
Pj가R에 위치해있기 때문에 (monitor내부에 존재해있지 않음) 가능한 것이다. (왜냐하면monitor에는 1개만 있을 수 있으므로)
3) Monitor state 3
- Pj가 R 반환
- R_Free.signal() 호출에 의해 Pk가 wakeup

Pj는entry queues for releaseR()로 가게 됨.releaseR()에Pj이동signaler queue로Pj이동signaler queue에 담겨있던Pj가condition queue R_Free에서 대기하고 있던Pk를 깨워줌requestR()에Pk들어감
4) Monitor state 4
- 자원 R이 Pk에게 할당됨
- Pj가 모니터 안으로 돌아와서, 남은 작업 수행

Pk가R로 이동 (자원이 Pk에게 할당됨)signaler queue에 존재하고 있던Pj가 남은 작업을 수행하기 위해realeaseR()로 이동 (현재,Pk가R로 이동했기 때문에 모니터에는 프로세스가 없음)Pk가 작업을 다하고releaseR()을 벗어남
6. Producer-Consumer Problem

- 사이즈가 N인 원형 큐
- shared data (= critical data)
- in(P), out(C) : 위치 정보
- validBufs : 물건 수
- entry queue for fillBuf() : 물건을 넣을 때 (P가 접근)
- entry queue for emptyBuf() : 물건을 뺄 때 (C가 접근)
- bufHasData : 가져갈 것이 있나? (C의 큐)
- bufHasSpace : 공간이 있나? (P의 큐)
- signaler queue : 전화부스

- 프로듀서가 채우려고 옴
- 공간이 다찼는지 확인
- 공간이 다찼다면 대기
- 공간이 있으면 물건을 놓고
- 물건 수 증가
- 공간 idx 갱신 (원형 큐이므로 나머지 연산 이용)
- 물건 넣었다는 signal 보냄
- 공간이 다찼는지 확인
- 컨슈머가 물건 가지러가려고 옴
- 물건이 없는지 확인
- 물건이 생길 때까지 대기
- 물건이 있으면 물건을 꺼내고
- 물건을 줄이고
- idx 갱신 (원형 큐이므로 나머지 연산 이용)
- 나가면서 공간 생겼다는 signal보냄
- 물건이 없는지 확인
7. Reader-Writer Problem
- reader/writer 프로세스들 간의 데이터 무결성 보장 기법
- writer 프로세스에 의한 데이터 접근 시에만 상호 배제 및 동기화 필요함
1) 모니터 구성
- 변수 2개
- 현재 읽기 작업을 진행하고 있는 reader프로세스의 수
- 현재 writer 프로세스가 쓰기 작업을 진행 중인지 표시
- 조건 큐 2개
- reader/writer 프로세스가 대기해야할 경우에 사용
- 프로시져 4개
- reader(writer) 프로세스가 읽기(쓰기) 작업을 원할 경우에 호출, 읽기(쓰기) 작업을 마쳤을 때 호출

8. Dining philosopher problem
철학자의 저녁식사 문제
- 5명의 철학자
- 철학자들은 생각하는 일, 스파게티 먹는 일만 반복함
- 공유 자원 : 스파게티, 포크
- 스파게티를 먹기 위해서는 좌우 포크 2개 모두 들어야함.
- but 현재 포크 5개만 존재


- pickup(i), putdown(i) : procedure

- 포크 들기
- 현재 내가 쓸 수 있는 포크 수가 2개가 아니라면
- 내 방에 와서 나를 깨울 때까지 기다리기
- 내 오른쪽, 왼쪽에 있는 사람들이 쓸 수 있는 포크수 각각 -1
- 현재 내가 쓸 수 있는 포크 수가 2개가 아니라면
- 포크 내려놓기
- 내 오른쪽, 왼쪽에 있는 사람들이 쓸 수 있는 포크 수 각각 +1
- 혹시 오른쪽, 왼쪽 사람들이 각자의 방에서 쉬고 있었다면 signal 보내 부르기

9. Monitor의 특징
1) 장점
- 사용이 쉽다 => 실수할 가능성이 줄어든다
- Deadlock 등 error 발생 가능성이 낮음
2) 단점
- 지원하는 언어에서만 사용 가능
- 컴파일러가 OS를 이해하고 있어야 함
- Critical section 접근을 위한 코드 생성
'CS > OS' 카테고리의 다른 글
| 6. 프로세스 동기화 & 상호배제 (6) - Eventcount/Sequencer (0) | 2021.05.14 |
|---|---|
| 6. 프로세스 동기화 & 상호배제 (5) - Semaphore (0) | 2021.05.14 |
| 6. 프로세스 동기화 & 상호배제 (4) - Spinlock (0) | 2021.05.13 |
| 6. 프로세스 동기화 & 상호배제 (3) - HW solution (0) | 2021.05.12 |
| 6. 프로세스 동기화 & 상호배제 (2) - sw solutions (0) | 2021.05.12 |