- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
3.5进程通信*按交换信息量的大小,可以把进程之间的通信分成低级通信和高级通信。在低级通信中,进程之间只能传递状态信息和整数值,信号量机制属于低级通信方式。在高级通信中,进程之间可以传递任意数量的数据,传递的信息量大,操作系统隐藏了进程通信的实现细节,大大简化了进程通信程序编制上的复杂性。高级通信机制可分为三大类:0102用信号灯解决互斥问题*如果信号量的初值为1,表示仅允许一个进程访问临界区,此时的信号量转换为互斥信号量。010203P操作和V操作分别置于进入区和推出区。如定义mutex为互斥信号量,其初值为1,P,V操作的位置如书中图3-9 用信号灯解决互斥问题 semaphoremutex=1; P1: while(1){ P(mutex); 临界区; V(mutex); 剩余区; };P2: while(1){ P(mutex); 临界区 V(mutex); 剩余区; };用信号灯解决同步问题*0102030405即:可以控制进程执行的先后顺序semaphorea,b=0,0;{P(b);s3}{s1;V(a);V(b)}{P(a);s2}3.2经典进程同步问题*生产者——消费者问题读者——写者问题哲学家进餐问题打磕睡的理发师问题生产者-消费者问题*缓冲池是由若干个大小相等的缓冲区组成的,每个缓冲区可以容纳一个产品。生产者进程不断地将生产的产品放入缓冲池,消费者进程不断地将产品从缓冲池中取出。指有两组进程共享一个环形的缓冲池。一组进程被称为生产者,另一组进程被称为消费者。用信号量解决“生产者-消费者”问题*voidconsumer()//消费者进程{while(true){P(full);P(mutex);data_c=buffer[j];j=(j+1)%n;V(mutex);V(empty);consumetheitemindata_c;}}semaphoremutex=1;
semaphoreempty=n;
semaphorefull=0;inti,j;
ITEMbuffer[n];
ITEMdata_p,data_c;voidproducer()//生产者进程{while(true){produceanitemindata_p;P(empty);P(mutex);buffer[i]=data_p;i=(i+1)%n;V(mutex);V(full);}}读者-写者问题*一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。问题描述:读者可同时读;读者读时,写者不可写;写者写时,其他的读者、写者均不可进入。用信号量解决读者-写者问题*读者进程: while(true) { ‘有人要读’P(Wmutex); 读; ‘无人读了’V(Wmutex); }写者进程:while(true){ P(Wmutex); 写; V(Wmutex);}semaphoreWmutex=1;用信号量解决读者-写者问题*voidreader()/*读者进程*/{while(true){P(Rmutex); if(Rcount==0)P(Wmutex); Rcount=Rcount+1; V(Rmutex); read;/*执行读操作*/ P(Rmutex); Rcount=Rcount-1; if(Rcount==0)V(Wmutex); V(Rmutex);}}SemaphoreWmutex,Rmutex=1,1;intRcount;voidwriter()/*写者进程*/{while(true){P(Wmutex); write;/*执行写操作*/V(Wmutex);
文档评论(0)