信号量机制与互斥的加锁实现的优缺点比较

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

互斥的加锁实现与信号量机制的优缺点对比

(一)互斥的加锁实现

当某个进程进入临界区之后,临界区将被上锁,直到它退出临界区为止。并发进程在申请进入临界区之前,首先测试该临界区是否是上锁的。如果是上锁的,则要等到开锁以后才有可能活的临界区。

设临界区类名为S,锁定位key【S】。

加锁后临界区程序描述如下:

Lock(key【S】)

<临界区>

Unlock(key【S】)

设key【S】=1时表示该临界区可用,key【S】=0时表示该临界区不可用。则unlock(key 【S】)只用一条语句即可实现。即:

Key【S】<—1

不过由于lock(key【S】)必须满足key【S】=0时,不允许任何进程进入临界区,而key 【S】=1时仅允许一个进程进入临界区的准则,因而实现起来较为困难。仍存在一些影响系统可靠性和执行效率的问题,例如循环测试定位将消耗较多的cpu计算时间等等。还会导致一些不公平现象。每个进程能否进入临界区是依靠自己的测试判断。这样,没有获得执行机会的进程当然没法判断,从而产生某进程处于永久饥饿状态。

(二)信号量机制

信号量sem是一整数。在sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待实用临界区的进程数。显然,对于互斥的信号量sem初值应该大于零。

P,V原语操作能改变信号量的数值,信号量(sem)可代表管理相应临界区公共资源的实体。而一次P操作使得sem减1,一次V操作使得sem加1。

P,V操作中进程不需要象加锁时要不断的测试,而是在队列里等待其他进程执行V操作时,就可以进入临界区了。这样P,V操作比加锁更简单,且表达能力强,但P,V相对来说不安全,会出现死锁,遇到复杂的同步互斥问题时会更复杂。

若此时有a和b两个进程,加锁实现是:a先获得锁,然后b也要获得锁,而因为a已经占有锁了,所以b会进入休眠。当a释放锁后,会去唤醒在等待队列上的进程,按正常逻辑此时应该是b被唤醒而获得锁。但是现在却是,a在释放锁之后,又重新获得锁,a会在调度b之前先将计数值减1,然后才调度进程b,b会因为判断计数值不成功而重新进入休眠。而信号量却不是这样的,信号量是在a释放这个信号之后,唤醒等待队列上的进程,此时会马上调度b,使b获得信号量,若a又要重新获得信号量,会因为信号量的计数值小于等于0而进入休眠。

相关文档
最新文档