欢迎来到天天文库
浏览记录
ID:51852630
大小:69.50 KB
页数:7页
时间:2020-03-17
《操作系统 作业答案.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第九题设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售;销售者每次循环从仓库中取出一个产品进行销售。如果不允许同时入库,也不允许边入库边出库;而且要求生产和消费A产品和B产品的件数都满足以下关系:-n≤A的件数-B的件数≤m,其中n、m是正整数。分析:生产者A、B和消费者之间不能同时将产品入库和出库,故仓库是一个临界资源。生产的A、B产品必须满足:-n≤A的件数-B的件数≤m,如练习5中,同样的方法管理,分别使用了信号量SAB和SBA;仓库的管理只要求出入库互斥,由于仓库无限大入库只需操作互斥就可以完成,出库要考虑有无产品,
2、SA对应于仓库中的A产品量,SB对应于仓库中的B产品量;销售要满足:-n≤A的件数-B的件数≤m,用difference表示A的件数-B的件数,即difference=A的件数-B的件数;difference==-n的时候,不能取产品B,只能取A;difference==m的时候,不能取产品A,只能取B;-n3、的产品数量,其初值为n;另外,还需设置一个整数difference表示所销售的A、B产品数量之差,而为了同步生产者和销售者并使销售的A、B产品的件数-n≤A的件数-B的件数≤m,还需要设置三个资源信号量,其中S对应于仓库中的总的产品量,SA对应于仓库中的A产品量,SB对应于仓库中的B产品量,它们的初值都为0.SemaphoreSAB=m,SBA=n,S=0,SA=0,SB=0,mutex=1;processA(){while(1){//生产产品,-n≤A的件数-B的件数≤m,方法同第4题wait(SAB);ProduceaproductA;signal(SBA);//入库操作,满足出入库4、操作互斥即可wait(mutex);addtheproductAtothestorehouse;signal(mutex);signal(SA);//入库产品A一件,所以给SA增值signal((S);//入库产品一件,所以给S增值,S是仓库中全部产品的数量}}processB(){while(1){//生产产品,-n≤A的件数-B的件数≤m,方法同第4题wait(SBA);ProduceaproductB;signal(SAB);//入库操作,满足出入库操作互斥即可wait(mutex);addtheproductAtothestorehouse;signal(mutex);signa5、l(SB);//入库产品A一件,所以给SA增值signal((S);//入库产品一件,所以给S增值,S是仓库中全部产品的数量}}processC(){while(1){wait(S);//首先检查有无产品,无产品阻塞,有产品,下面操作将会取走一件产品,所以S减1if(difference<=-n){wait(SA);//difference<=-n时只能取A产品一件,无A产品则需阻塞//出库操作,满足出入库操作互斥wait(mutex);takeaproductAfromstorehouse;signal(mutex);difference++;//取A产品一件,difference++6、}elseif(difference>=m){wait(SB);//difference>=m时只能取B产品一件,无B产品则需阻塞//出库操作,满足出入库操作互斥wait(mutex);takeaproductBfromstorehouse;signal(mutex);difference--;//取B产品一件,difference--}else{//-n7、nal(mutex);if(product_type==A){//取的是产品A,则信号量SA减1,这里不可能发生没有A产品,进程C需要阻塞的情况wait(SA);difference++;//取A产品一件,difference++}else{//取的是产品B,则信号量SB减1,这里不可能发生没有B产品,进程C需要阻塞的情况wait(SB);difference--;//取B产品一件,difference--}}Selltheprod
3、的产品数量,其初值为n;另外,还需设置一个整数difference表示所销售的A、B产品数量之差,而为了同步生产者和销售者并使销售的A、B产品的件数-n≤A的件数-B的件数≤m,还需要设置三个资源信号量,其中S对应于仓库中的总的产品量,SA对应于仓库中的A产品量,SB对应于仓库中的B产品量,它们的初值都为0.SemaphoreSAB=m,SBA=n,S=0,SA=0,SB=0,mutex=1;processA(){while(1){//生产产品,-n≤A的件数-B的件数≤m,方法同第4题wait(SAB);ProduceaproductA;signal(SBA);//入库操作,满足出入库
4、操作互斥即可wait(mutex);addtheproductAtothestorehouse;signal(mutex);signal(SA);//入库产品A一件,所以给SA增值signal((S);//入库产品一件,所以给S增值,S是仓库中全部产品的数量}}processB(){while(1){//生产产品,-n≤A的件数-B的件数≤m,方法同第4题wait(SBA);ProduceaproductB;signal(SAB);//入库操作,满足出入库操作互斥即可wait(mutex);addtheproductAtothestorehouse;signal(mutex);signa
5、l(SB);//入库产品A一件,所以给SA增值signal((S);//入库产品一件,所以给S增值,S是仓库中全部产品的数量}}processC(){while(1){wait(S);//首先检查有无产品,无产品阻塞,有产品,下面操作将会取走一件产品,所以S减1if(difference<=-n){wait(SA);//difference<=-n时只能取A产品一件,无A产品则需阻塞//出库操作,满足出入库操作互斥wait(mutex);takeaproductAfromstorehouse;signal(mutex);difference++;//取A产品一件,difference++
6、}elseif(difference>=m){wait(SB);//difference>=m时只能取B产品一件,无B产品则需阻塞//出库操作,满足出入库操作互斥wait(mutex);takeaproductBfromstorehouse;signal(mutex);difference--;//取B产品一件,difference--}else{//-n7、nal(mutex);if(product_type==A){//取的是产品A,则信号量SA减1,这里不可能发生没有A产品,进程C需要阻塞的情况wait(SA);difference++;//取A产品一件,difference++}else{//取的是产品B,则信号量SB减1,这里不可能发生没有B产品,进程C需要阻塞的情况wait(SB);difference--;//取B产品一件,difference--}}Selltheprod
7、nal(mutex);if(product_type==A){//取的是产品A,则信号量SA减1,这里不可能发生没有A产品,进程C需要阻塞的情况wait(SA);difference++;//取A产品一件,difference++}else{//取的是产品B,则信号量SB减1,这里不可能发生没有B产品,进程C需要阻塞的情况wait(SB);difference--;//取B产品一件,difference--}}Selltheprod
此文档下载收益归作者所有