如何使用信号量实现监视器?
operating systemwindowsmca更新于 2026/5/12 6:22:17
要使用信号量实现监视器,每个监视器都配备一个信号量 mutex(初始化为 1)。进程在进入监视器之前必须执行 wait(mutex),离开监视器之后必须执行 signal(mutex)。由于发出信号的进程必须等待被恢复的进程离开或等待,因此引入了一个额外的信号量 next,初始化为 0。发出信号的进程可以使用 next 来挂起自身。此外,还提供了一个整型变量 next_count 来统计因 next 而挂起的进程数。因此,每个外部函数 F 都被替换为——
wait(mutex); … body of F ... if (next_count > 0) signal(next); else signal(mutex);
监视器内部的互斥得到保证。现在让我们看看条件变量是如何实现的。对于每个条件 x,我们引入一个信号量 x_sem 和一个整型变量 x_count,两者都初始化为 0。现在可以实现 x.wait() 操作。 −
x_count++;
if (next_count > 0){
signal(next);
}
else {
signal(mutex);
}
wait(x_sem);
x_count--;
x.signal() 操作可以实现为 −
if (x _count > 0){
next_count++;
signal(x_sem);
wait(next);
next_count--;
}