我正在学习期中考试,这是一个练习题:展示如何只使用二进制信号量和普通机器指令来实现计数信号量(即可以保持任意值的信号量)?
我甚至不确定从哪里开始 . 我在网上发现了这个;
P(s) { Pb(mutex_s); s = s-1; if(s < 0) {Vb(mutex_s); Pb(delay_s);} Vb(mutex_s); }
V(s) { Pb(mutex_s); s = s+1; if(s <= 0) Vb(delay_s); else Vb(mutex_s); }
不幸的是,我真的不明白答案告诉我的是什么 . 任何人都可以向我解释这个答案,或者用伪代码告诉我如何回答?
5 回答
我在Prahbat's上 Build 了以下直觉:
我们想要复制的内容:
我们可以使用二进制信号量来做到这一点:
如果其关键部分中已有N个进程,则计数信号量将锁定对线程临界区的访问
=>我们需要一个二进制信号量sectionLock,它告诉等待线程是否可以访问它们的临界区(sectionLock = 1)或者它们不能(sectionLock = 0)
我们必须跟踪在其关键部分中访问资源的线程数 . 设这个计数器是整数
count在线程进入临界区时递减(即,该资源中的线程少一个点),并在退出临界区的线程上递增(即为该资源中的一个线程释放一个点)
=> count是一个共享资源,一次只能由一个线程访问
=>我们需要一个二进制信号量countLock来计算
如果count <= 0,那么我们不能允许任何线程进入临界区,并且必须等待一个退出线程释放sectionLock
因此,下面的伪代码表明了自己
如果我出错了,请告诉我 .
来源:http://www.cs.umd.edu/~shankar/412-Notes/10x-countingSemUsingBinarySem.pdf
弄清楚了:
我有一个类似的问题,我认为会有相同的答案,即“你如何使用互斥量实现计数信号量” .
请注意,二进制信号量可以被认为是互斥量 . 实际上,在不提供互斥锁的系统上,可以使用二进制信号量来提供互斥 .