二元信号量如何实现n个进程之间的互斥?


信号量是一个共享变量,用于在系统进程之间实现互斥。它主要用于解决临界区问题,是一种实现进程同步的技术。

信号量有两种类型,如下所示:

  • 二元信号量 - 只能取两个值,0 或 1,这意味着一次只有一个进程可以进入临界区。信号量初始化为 1。

  • 计数信号量 - 可以取任何非负值 N,这意味着一次最多可以有 N 个进程进入临界区。信号量初始化为 N。

临界区由 P 和 V 操作包围,如下所示:

  • P(s)

  • 临界区 (CS)

  • V(s)

每个操作的定义如下:

Wait(P) - 当一个进程进入临界区时,首先执行 P 操作,它会减少信号量的值,如果之后 s >= 0,则进入临界区,否则添加到等待队列。

P(Semaphore s)
{
   s = s - 1;
   if (s < 0) {
      block(p);
   }
}

Signal(V) - 当一个进程退出临界区时,执行 V 操作,它会增加信号量的值,表示另一个当前被 P 操作阻塞的进程可以进入临界区。

V(Semaphore s)
{
   s = s + 1;
   if (s >= 0) {
      wakeup(p);
   }
}

现在让我们看看如何使用二元信号量来实现n个进程之间的互斥。

我们知道,信号量是一个变量,可以用来控制多进程在多任务操作系统中对公共资源的访问。根据题意,如果有多个进程共享一个信号量,那么进程分配是基于以下算法组织的。

do {
   wait(mutex);
   signal(mutex);
} while (true);

说明

它使用 do-while 循环处理,这意味着它执行“do”条件,直到满足“while”条件。

在这里,它执行互斥锁的等待和信号操作,直到它变为真。

更新于:2021年12月2日

2K+ 阅读量

启动你的职业生涯

完成课程获得认证

开始学习
广告