Monitor Implementation with Semaphores
Introduction
Monitor 可用 semaphores 實作,目標是:
- 同一時間只有一個 process 在 monitor 內
- 支援 condition variable 的
wait()/signal()
以下以 signal-and-wait semantics 為例。
Mutual Exclusion inside Monitor
每個 monitor 有一個 binary semaphore:
semaphore mutex = 1;每個 external monitor function 外層包成:
wait(mutex);
/* body of monitor function */
if (next_count > 0)
signal(next);
else
signal(mutex);mutex 控制 monitor entry;next 讓 signaler 暫停,讓被 signal 的 process 先執行。
Condition Variable Implementation
每個 condition variable x 維護:
semaphore x_sem = 0;
int x_count = 0;x.wait():
x_count++;
if (next_count > 0)
signal(next);
else
signal(mutex);
wait(x_sem);
x_count--;呼叫者離開 monitor 的 active position,睡在 x_sem。
x.signal():
if (x_count > 0) {
next_count++;
signal(x_sem);
wait(next);
next_count--;
}若有人在等 x,signaler 喚醒一個等待者後自己睡在 next,維持 monitor 內只有一個 active process。