Monitor Implementation with Semaphores

Introduction

Monitor 可用 semaphores 實作,目標是:

  1. 同一時間只有一個 process 在 monitor 內
  2. 支援 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。