操作系统课件拷贝练习.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文档。上传文档
查看更多
操作系统课件拷贝练习

例1:修改书上读者优先的程序为读写公平;例2:用PV操作解决读者和写者之间的同步问题,且写者优先;int readcount, writecount; semaphore mutex=1,wmutex=1,rwmutex=1,x=1; void reader( ) { while(1){ p(x) p(rmutex) ++readcount; if(readcount==1) p(rwmutex); v(rmutex); v(x); read data; p(rmutex); - - readcount; If(readcount==0) v(rwmutex); v(rmutex); } } ;int readcount, writecount; semaphore mutex=1,wmutex=1,rwmutex=1,x=1; void writer( ) { while(1){ p(wmutex) ++writecount; if(writecount==1) p(x); v(wmutex); p(rwmutex); write data; v(rwmutex); p(wmutex); - - writecount; If(writecount==0) v(x); v(wmutex); } } ;例3:改进书上的哲学家进餐算法,通过限制同时进餐的人数来防止死锁;semaphore fork[5]; semaphore count=4; for(int i=0;i5;i++) fork[i]=1; cobegin process phiosopher_i() //i=0,1,2,3,4 { while(true){ think(); P(count); P(fork[i]); P(fork[(i+1)%5]); eat(); V(fork[i]); V(fork[(i+1)%5]); v(count); } } coend;;例4:现有四个进程:R1,R2,W1和W2,它们共享可以存放一个数的缓冲区B。进程R1每次把从键盘上读入的一个数存到缓冲区B中,供进程W1打印输出;进程R2每次把从磁盘上读一个数存放到缓冲区B中,供进程W2打印输出。怎样用P、V操作协调四个并发进程的工作。;设信号量e,f1,f2; 其初值分别为 e=1,f1=0,f2=0;例5:设有3个并发执行的进程:输入进程Pi、计算进程Pc和输出进程Po。其中进程Pi不断地从键盘读入整数,放入缓冲区Buf1,Pc按输入顺序从Buf1中取数据,每次取出2个整数,计算其和,将结果放入缓冲区Buf2。Po负责将Buf2中的数据按顺序输出。设缓冲区Buf1、Buf2可存放的整数个数分别为m、n(m、n0)。要求利用信号量的P、V操作写出进程Pi、Pc、Po的算法。;; 例6:举例说明P、V操作为什么要求设计成原语(即对同一信号量上的操作必须互斥) (1)设信号量S的初值为1,当一个P操作执行完S=S-1后,S的值为0,该P操作不应被阻塞。但若P操作不是一个原语,也就是说在一个P操作执行过程中可以由另一个P操作同时,???这时的S的值为-1。这是第一个P操作将会被阻塞。这样的P操作不符合P操作的语义。;(2)设信号量S的初值为-1,当一个V操作执行完S:=S+1后,S的值为0,该V操作应该唤醒一个被P操作阻塞得进程。但若V操作不是一个原语,也就是说在一个V操作执行的过程中可以有另一个V操作同时在执行。加入第2个V操作在第1个V操作执行判断语句IFS=0前夜执行了S :=S+1操作,则这时的S值为1。这时第1个操作将不再去唤醒被阻塞得进程。这样的V操作不符合V操作的语义。 (3)同样地,当P操作的执行过程中插入了V操作,也会出现不符合原语语义的情况。例如,在P操作执行完S:=S-1后,S的值为-1,经判断,该进程应该被阻塞。但若要在进行判断后阻塞进程前执行完另外-V操作,则该V操作并没有可以唤醒的被阻塞得进程。而当V操作执行完后继续执行P操作时,该P操作仍将阻塞该进程,这一进程将不被唤醒。对于V操作的执行过程中插入了P操作,也会出现不符合原语语义的情况。例

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档