1. Low Level Solution
- 이전까지 알아본 HW, SW, OS Supported 솔루션들은 low level에서의 솔루션
- low level인 만큼 보다 세세한 부분까지 컨트롤 가능하지만 그만큼 구현과 사용이 여러움
- 잘못 사용하면 에러가 발생하기 쉬움
2. High Level Solution
- Monitor
- 공유 데이터와 임계 영역(Critical Section)의 집합
- 개체지향적인 관점으로 접근하는 동기화 기법
- Path Expression
- 프로세스의 실행에 있어 허용되는 시퀀스(순서)를 표헌하기 위한 방식
- 프로세스 동기화 정책을 표현식으로 나타내는 것으로 복잡한 시스템의 설계오류를 방지할 수 있음
- Serializer
- 프로세스 실행의 직렬화, 즉 프로세스를 동시(concurrently)에 실행하지 않고 순차적으로 실행
- 당연하게도 한순간에 하나의 프로세스만을 실행하기에 성능이 떨어진다.
- 그러나 올바른 순서에 따라 순차적으로 프로세스를 수행할 경우에 얻을 수 있는 올바른 결과는
동기화가 적절하게 이루어졌는지 확인하기 위한 기준점이 될 수 있다.
3. Monitor
- 구조
- 진입 큐(Entry Queue)
- 모니터에 진입하려는 프로세스들의 대기열
- 모니터의 프로시저의 수(함수의 수)만큼 존재
- 상호 배제(Mutual Exclusion)
- 모니터 내에는 동시에 하나의 프로세스만이 존재할 수있음
- 모니터 내에는 동시에 하나의 프로세스만이 존재할 수있음
- 정보 은폐(Information Hiding)
- 공유 데이터에는 모니터 내의 프로세스만이 접근할 수 있음
- 공유 데이터에는 모니터 내의 프로세스만이 접근할 수 있음
- 조건 큐(Condition Queue)
- 모니터 내의 특정 이벤트를 기다리는 대기열
- 모니터 내의 특정 이벤트를 기다리는 대기열
- 신호 큐(Signaler Queue)
- signal 명령을 실행한 프로세스가 신호를 보내기 위해 잠시 들어가는 대기열
- signal 명령을 실행한 프로세스가 신호를 보내기 위해 잠시 들어가는 대기열
- 진입 큐(Entry Queue)
- 모니터를 사용한 자원 할당 문제의 해결
// 자원 요청 프로시저 void request() { // 자원이 없을 경우 자원이 생겼다는 신호가 올 때까지 대기 if(!R_Available) R_Free.wait(); // 자원이 있을경우 가져감 R_Available = false; } // 자원 반납 프로시저 void release() { // 자원 반납 후 조건 큐에서 대기중인 프로세스를 깨우기 위해 시그널을 보냄 R_Available = true; R_Free.signal(); }
- 공유자원 R과 그 자원을 요청하는 함수(request)와 반납하는 함수(release)가 있을 때
자원을 요청/반납하는 여러 프로세스들의 동기화를 구현 - 기본적인 방식은 세마포어 등과 크게 다르지 않지만 객체지향적인 방식으로 접근하는 것으로
더 직관적이고 구현이 쉬움 - 생산자-소비자 문제나 Reader-Writer 문제 등도 모니터를 사용하여 보다 쉽게 해결 가능
- 공유자원 R과 그 자원을 요청하는 함수(request)와 반납하는 함수(release)가 있을 때
- high level solution인 만큼 사용이 쉽고 에러발생의 가능성이 낮음
- 프로그래밍 언어에서 이를 지원해야만 사용할 수 있음
- C#, C++, Java 등의 언어가 모니터 클래스를 지원
'CS > 운영체제' 카테고리의 다른 글
#10 메모리 관리(Memory Management) - 용어정리 (0) | 2022.01.07 |
---|---|
#9 교착 상태(Deadlock) (0) | 2022.01.03 |
#7 동기화(Synchronization) 4 - OS Supported Solution (0) | 2021.12.27 |
#6 동기화(Synchronization) 3 - HW Solution (0) | 2021.12.24 |
#5 동기화(Synchronization) 2 - SW Solution (0) | 2021.12.23 |