信号量与pv操作.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
结构型信号量与PV操作的关系 推论1:若信号量s.value为正值,则该值等于在封锁进程之前对信号量s可施行的P操作数、亦等于s所代表的实际还可以使用的物理资源数 推论2:若信号量s.value为负值,则其绝对值等于登记排列在该信号量s队列之中等待的进程个数、亦即恰好等于对信号量s实施P操作而被封锁起来并进入信号量s队列的进程数 推论3:通常,P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作代表挂起进程操作,而V操作代表唤醒被挂起进程的操作 记录型信号量与PV操作的注意事项 P 操作 信号量的值减一 如果满足if条件,执行了P操作的进程会挂起,P操作语句之后的语句都不会再执行。 被挂起的进程,除非另一个进程调用V()来唤醒它,否则永远不会执行。 V 操作 信号量的值加一 如果满足if条件,执行V操作的进程会去唤醒另一个正在等待的进程(被挂起的进程)。 执行V操作的进程不会自愿停止, V操作后面的语句会接着执行 被唤醒的进程只是进入了就绪队列,并不一定有机会马上被执行 被唤醒的进程,从挂起点接着执行,也就是P操作之后的语句 2 二元信号量 设s为一个结构型数据结构,其中一个为value,它仅能取值0和1,另一个分量为信号量队列头指针list typedef struct binary_semaphore{ int value; struct pcb *list; }; void BP(binary_semaphore s){ if(s.value==1); s.value=0; else W(s.list); } void BV(binary_semaphore s){ if s.liat is empty()) s.value=1; else R(s.list); } 可以证明,二元信号量与其他结构信号量具有一样的表达能力。 3.3.3 信号量实现进程互斥 semaphore mutex; mutex= 1; cobegin …… process Pi(){ //i=1,2,…,n ………. P(mutex); {临界区;} V(mutex); ………. } coend; 信号量解决机票问题 哲学家吃通心面问题 哲学家吃通心面问题示意图 哲学家吃通心面问题 上述算法能够实现进程的互斥(同步),但是,它可能发生死锁:如果每一个哲学家依次拿起右边(或者左边)的叉子,结果就会出现每一个人都拿到一把叉子,而都等待第二把叉子的现象。 解决死锁问题的方案: 至多允许4位哲学家吃面; 奇数号哲学家先拿左边的叉子,偶数号哲学家先拿右边的叉子; 规定每一个哲学家都必须拿到两把叉子才能吃面,否则一把也不拿——即当拿不到第二把叉子时,即放弃已拿到的第一把。注意:实现该方案需要修改信号量和PV操作的定义! 生产者消费者问题 一个生产者一个消费者共享一个缓冲区 过程分析 过程分析 一个生产者一个消费者共享多个缓冲区 m个消费者和n个生产者共享多个缓冲区 实例分析 实例分析 P操作的次序 读者写者问题 理发师问题 苹果桔子问题 情况一 (producer在临界区中, consumer加入) producer_i: P(empty);(empty=k-1) P(mutex);(mutex=0) 临界区 consumer_i: P(full); (full=-1;) 挂起 producer_i: V(mutex);(mutex=1) V(full); (full=0;)(唤醒consomer_i) comsumer_i: P(mutex); (mutex=0;) 临界区; V(mutex);(mutex=1;) V(empty); (empty=k) 情况二: (consumer先启动) consumer_i: P(full); (full=-1;) 挂起 producer_i: P(empty);(empty=k-1;) P(mutex);(mutex=0) 临界区; V(mutex);

文档评论(0)

135****2083 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档