기어가더라도 제대로
[운영체제-김덕수교수님] 프로세스 상호배제, 동기화(7/7) - Monitor 본문
Semaphore 를 비롯한 운영체제 레벨의 동기화, 상호배제 로직은 복잡하고 쓰기가 어렵다.
그래서 사용이 쉬운 언어 레벨의 상호배제와 동기화를 배워보자.
High-level Mechanism
- Monitor
- Language-level constructs
- Object-Oriented concept과 유사
- 사용이 쉬움
Monitor
- 공유 데이터와 Critical section의 집합
- Conditional variable
- wait(), signal() operations
- 한번에 한명만 들어올 수 있는 책방을 가정해보자.
구조
- Entry Queue(진입큐)
- 모니터 내의 procedure(function) 수만큼 존재
- Mutual exclusion
- 모니터 내에는 항상 하나의 프로세스만 진입 가능
- Information hiding (정보 은폐)
- 공유 데이터는 모니터 내의 프로세스만 접근 가능
- Condition Queue(조건 큐)
- 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기
- Signaler queue(신호 제공자 큐)
- 모니터에 항상 하나의 신호제공자 큐가 존재
- signal() 명령을 실행한 프로세스가 임시 대기
모니터의 자원할당 문제
- 자원 요청 명령
- 자원 반납 명령
코드는 쉬운 편
이해는 어려운 편
- Pj 가 처음으로 "RequestR() 엔트리 큐"에 담긴다.
- R_available 이 Max_ 1 이라고 가정하면 현재는 0이며 비어 있으므로 RequestR()로 Pj 가 담긴다.
- Pj 가 리소스를 할당 받고 일을 처리한다.
- 그 사이 RequestR 엔트리 큐에 Pk 와 Pr 이 담긴다.
- Pk 와 Pr은 현재 리소스를 Pj 가 사용하고 있으므로 Condition_queue 에 가서 기다린다.
- 일을 마친 Pj 는 ReleaseR() 엔트리 큐에 담겼다가 releaseR() 로 간다.
- 그러면 현재 R_available 의 최대 허용 개수는 1개이므로 더 프로세스가 들어올 수 없다.(현재 Pj 가 있기 때문)
- 그러므로 잠시 Pj 가 signaler queue 로 가서 R_available 을 1로 만든다.
- signaler queue 에서 condition queue 에 담긴 Pk 를 깨워서 RequestR() 로 보냈다가 R 를 할당한다.(이게 "signal()"인가?)
- 그럼 다시 R_available 이 1 이 되는데 signaler queue 에 담겼던 Pj 가 미처다 못한 일을 처리하기 위해 releaseR() 에 담겨서 일을 처리하고 끝난다.
생산자와 소비자 문제
말하는 대로 짜면 되긴 한다.
고민해보고 아래 코드를 보자.
Reader-Writer Problem
- reader/writer 프로세스들간의 데이터 무결성 보장 기법
- writer 프로세스에 의한 데이터 접근 시에만 상호 배제 및 동기화 필요함
- 모니터 구성
- 변수 2개
- 현재 읽기 작업을 진행하고 있는 reader 프로세스의 수
- 현재 writer 프로세스가 쓰기 작업을 진행 중인지 표시
- 조건 큐 2개
- reader/writer 프로세스가 대기해야 할 경우에 사용
- 프로시져 4개
- reader(writer) 프로세스가 읽기(쓰기) 작업을 원할 경우에 호출
- reader(writer) 프로세스가 읽기(쓰기) 작업을 마쳤을 때 호출
- 변수 2개
Dining philosopher problem
- 5명의 철학자
- 철학자들은 생각하는 일, 스파게티 먹는 일만 반복함
- 공유자원: 스파게티, 포크
- 스파게티를 먹기 위해서는 좌우 포크 2개 모두 들어야함
철학자를 프로세스로 대입해보면 된다.
- 최초의 상태는 두개씩 쓸 수 있다.
- 2개씩 쓸 수 없으면 기달린다.
- 먹다가 다먹으면 옆에 있는 친구를 깨워준다.
장점
- 사용이 쉽다
- Deadlock 등 error 발생 가능성이 낮음
단점
- 지원하는 언어에서만 사용 가능
- 컴파일러가 OS를 이해하고 있어야함
- Critical Section 접근을 위한 코드 생성
'CS > 운영체제' 카테고리의 다른 글
[운영체제-김덕수 교수님] Deadlock (2/5) - 발생의 예 (0) | 2022.08.06 |
---|---|
[운영체제-김덕수 교수님] Deadlock (1/5) (0) | 2022.08.06 |
[운영체제- 김덕수 교수님] 프로세스 상호배제, 동기화(6/7) - Eventcount/Sequencer (0) | 2022.08.06 |
[운영체제 - 김덕수 교수님] 프로세스 동기화, 상호 배제 - Semaphore(5/7) (0) | 2022.08.03 |
[운영체제-김덕수 교수님] 프로세스 동기화, 상호 배제 - Spinlock(4/7) (0) | 2022.08.03 |
Comments