如何使用信号量实现监视器?

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--;
}


相关文章



关于我们 | 隐私条款 | 学习路线
返回顶部