信号量如何用于实现互斥?


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

信号量主要有以下两种类型:

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

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

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

  • P(s)

  • 临界区 (CS)

  • V(s)

每个操作的定义如下:

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

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

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

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

让我们看看如何使用锁变量来引入互斥:

它使用与信号量类似的机制,但一次只有一个进程可以进入临界区,并使用锁变量来实现同步,如下所示:

while(lock != 0);
Lock = 1;
//critical section
Lock = 0;

它检查锁是否等于0,如果是,则将锁设置为1,表示锁已被占用,然后进入临界区。如果锁不为0,则等待直到锁可用。退出临界区时,将锁恢复为0,表示锁可用,另一个进程可以进入临界区。

锁和信号量的区别在于,锁可以在用户模式下实现,而信号量在内核模式下实现。此外,锁只允许一个进程进入临界区,而信号量可以允许多个进程进入临界区。简而言之,信号量是锁的泛化。

更新于:2021年12月1日

7K+ 浏览量

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.