Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1772574
  • 博文数量: 272
  • 博客积分: 1272
  • 博客等级: 少尉
  • 技术积分: 1866
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-09 15:51
文章分类

全部博文(272)

文章存档

2016年(16)

2015年(28)

2014年(97)

2013年(59)

2012年(25)

2011年(47)

分类: LINUX

2011-09-15 20:47:44

P-V操作定义:

假设sem是个整型变量。
P原语的主要操作是:

1sem1

2)若sem1后仍大于或等于零,则该进程继续执行;

3)若sem1后小于零,则该进程被阻塞,在相应队列中排队,然后转向系统的进程调度。

V原语的主要操作是:

1sem1

2)若相加结果大于零,则进程继续执行;

3)若相加结果小于或等于零,则唤醒一阻塞在该信号量上的进程,然后再返回原进程继续执行或转进程调度。

典型理解偏差:

1.        V原语的12步来做,Sem不就永远大于0,那进程不就一直循环执行成为死循环了?

2.        Sem大于0那就表示有临界资源可供使用,为什么不唤醒进程?

3.        Sem小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?

4.        如果是互斥信号量的话,应该设置信号量Sen=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S<0 ,也还是执行不了,这是怎么回事呢?

5.        Sem的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?

析疑:

1.       P操作对sem1的。PV原语必须成对使用!从而不会造成死循环。

2.       Sem大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。

3.       V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使Sem1,以通知其它的进程,这个时候如果Sem<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来转手该类资源。比如,有2个某类资源,三个进程ABCD要用该类资源,最开始Sem=2,当A进入,Sem=1,当B进入Sem=0,表明该类资源刚好用完,当C进入时Sem=-1,表明有一个进程被阻塞了,D进入,Sem=-2。当A用完该类资源时,进行V操作,Sem=-1,释放该类资源,而这时Sem<0,表明有进程阻塞在该类资源上,于是唤醒一个。

4.       当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

5.       当信号量Sem小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。
阅读(2317) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~