一个二进制信号量如何实现n个进程之间的互斥?
信号量是一个共享变量,用于实现系统进程之间的互斥。它主要有助于解决临界区问题,是一种实现进程同步的技术。
有两种类型的信号量,如下所示-
二进制信号量-只能取两个值,0或1,这意味着一次只有一个进程可以进入临界区。信号量被初始化为1。
计数信号量-可以取任何非负值N,这意味着一次最多N个进程可以进入CS。信号量初始化为N。
临界区被P和V操作包围如下-
P(s)
CS
V(s)
这些操作中的每一个都定义如下-
Wait(P)−每当一个进程进入CS时,它首先执行P操作,它减少信号量值,如果之后s>=0则进入CS否则添加到等待队列中。
P(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条件。
在这里它执行互斥锁的等待和信号操作,直到它变为真。