二进制信号量如何实现 n 个进程之间的互斥?
operating systemhardwaresoftware & coding更新于 2026/2/8 13:07:17
信号量是一个共享变量,用于实现系统进程之间的互斥。它主要用于解决临界区问题,是一种实现进程同步的技术。
信号量有两种类型:−
二进制信号量 − 只能取两个值:0 或 1,这意味着同一时刻只有一个进程可以进入临界区。信号量初始化为 1。
计数信号量 − 可以取任意非负值 N,这意味着同一时刻最多有 N 个进程可以进入临界区。信号量初始化为 N。
临界区被 P 和 V 操作包围,如下所示 −
P(s)
CS
V(s)
每个操作的定义如下 −
Wait(P) − 每当进程进入 CS 时,它首先执行 P 操作,减少信号量值,如果之后 s>=0,则进入 CS,否则添加到等待队列。
V(Semaphore s)
{
s = s - 1;
if (s < 0) {
block(p);
}
}
Signal(V) − 当一个进程退出 CS 时,执行操作 V,该操作增加信号量的值,表示另一个进程可以进入当前被操作 P 阻塞的 CS。
V(Semaphore s)
{
s = s + 1;
if (s >= 0) {
wakeup(p);
}
}
现在让我们看看如何使用二进制信号量来实现 n 个进程之间的互斥。
我们知道,信号量是一个变量,在多任务操作系统中,可以用来控制多个进程对公共资源的访问。根据问题,假设有 n 个进程共享一个信号量,那么进程分配将根据以下算法进行组织。
do {
wait(mutex);
signal(mutex);
} while (true);
解释
它使用 do-while 循环进行处理,这意味着它会执行"do"条件,直到 while 条件满足为止。
在这里,它会执行互斥锁的等待和信号操作,直到条件变为真。