이 글은 KOCW에 공개되어있는 '반효경 교수님'의 운영체제 강의 및 강의 교재 Operation System Concepts(a.k.a 공룡책🦕)의 내용을 기반으로 작성했습니다.
이번 챕터에서는 지난 챕터에 이어 Process Synchronization의 Monitor에 관해 정리해보겠습니다
오류가 있다면 댓글로 정정 부탁드립니다
Monitor
동시 수행중인 프로세스 사이에서 abstract data type의 안전한 공유를 보장하기 위한 high-level synchronization construct
프로세스가 모니터 안에서 기다릴 수 있도록 하기 위해 condition variable을 이용한다(세마포어와 비슷한 역할 함)
monitor bounded_buffer
{
int buffer[N];
condition full, empty;
void produce(int x){
if there is no empty buffer
empty.wait();
add x to an empty buffer
full.signal();
}
void consume(int *x){
if there is no full buffer
full.wait();
remove an item from buffer and store it to *x
empty.signal();
}
}
monitor dining_philosopher
{
enum {thinking, hungry, eating} state[5];
condition self[5];
void pickup(int i){
state[i] = hungry;
test(i);
if (state[i] != eating){
self[i].wait();
}
void putdown(int i){
state[i] = thinking'
test((i+4)%5);
test((i+1)%5);
}
void test(int i){
if ((state[(i+4)%5] != eating) && (state[i] == hungry) && (state[(i+1) %5] != eating)){
state[i] = eating;
self[i].signal();
}
void init(){
for (int i = 0; i < 5; i++) state[i] = thinking;
}
}
↑ 모니터 코드로 진입하게 된다
Each Philosopher
{
pickup(i);
eat();
putdown(i);
think();
}while(1)
- 젓가락을 잡는 것은 모니터 내부의 함수