晚上用将近3个小时集体讨论了有关PV原语的一部分题目,虽然效果不是预期那么理想,但也是热热闹闹、百家争鸣。真理,总是越辩越清的嘛。
主要讨论了两道PV题,第一题(例2)主要用来将PV概念实例化,我计划能通过分析这道题能跟大家慢慢找到解这类题的一个关键所在。
尤其强调,要在读题、审题上要细心,说不上字字推敲,但也要能够将题意归纳、概括出重点。细细的审题很重要,细节决定成败。
小结:
1. 做这类题,要首先从题目中发掘出所有给出的进程及其间关系。
2. 明确信号量和相关进程之间存在着紧密的联系。
3. P:理解为申请资源;V:理解为释放资源。相对于同一信号量来说,P和V是成对出现的。
以下是在面对PV原语时,大家容易犯迷糊的地方。
一、以V原语的1、2步来做,Sem不就永远大于0,那进程不就一直循环执行成为死循环了?
解答:P操作对sem减1的。P、V原语必须成对使用!从而不会造成死循环。
二、Sem大于0那就表示有临界资源可供使用,为什么不唤醒进程?
解答:Sem大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。
三、Sem小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?
解答:V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使Sem加1,以通知其它的进程,这个时候如果Sem<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。 比如,有2个某类资源,三个进程A、B、C、D要用该类资源,最开始Sem=2,当A进入,Sem=1,当B进入Sem=0,表明该类资源刚好用完, 当C进入时Sem=-1,表明有一个进程被阻塞了,D进入,Sem=-2。当A用完该类资源时,进行V操作,Sem=-1,释放该类资源,而这时Sem<0,表明有进程阻塞在该类资源上,于是唤醒一个。
四、如果是互斥信号量的话,应该设置信号量Sen=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S〈0 ,也还是执行不了,这是怎么回事呢?
解答:当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。
五、Sem的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?
解答:当信号量Sem小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。
当看完这些疑惑解答,我想,对于PV操作的一些细微之处,我们有所了解了。