欢迎来到天天文库
浏览记录
ID:14271616
大小:79.00 KB
页数:15页
时间:2018-07-27
《信号量机制-课堂练习》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用wait,signal操作解决进程的同步和互斥问题,绝大部分题目可以按以下步骤解决:⑴根据题目要求将每个进程的执行过程一步一步描述出来;⑵分析每个进程每一步的执行条件,将条件一一记录;⑶比较各个条件,将同一条件归为一个,若条件可以归结为一种资源,设置一个信号量表示;注意:这里是做题,不是实现系统,所以若某个条件题目中没有加以说明或限制,则删除;⑷设置信号量初值:若信号量是代表某种资源,则为系统初始时的可使用的资源数或可使用资源的进程数,若为互斥则为“1”;⑸重新分析每个进程的每个步骤:若该步骤有执行条件涉及信号量A,则在该步骤语句前加入
2、wait(A);若该步骤有执行后某个信号量B会增值,则在该步骤语句后加入signal(B);注意:若某个步骤前同时有几个wait操作,则一般同步信号量在前,互斥信号量在后;⑹题目已经做完,最后检查各个进程是否能按题目要求并发执行,若可以,停止;若不可以,检查上述过程,查找错误。例1有一个生产者和一个消费者共享容量为n的缓冲器(n均大于1),生产者把生产的物品存入缓冲器,而消费者从缓冲器中取出物品去消费。要求用wait,signal操作对生产者和消费者进行正确管理。第一步根据题目要求将每个进程的执行过程一步一步描述出来:生产者进程L1:生产
3、一件产品;产品放入缓冲;gotoL1;消费者进程L2:从缓冲中区走产品;消费一件产品;gotoL2;第二步分析每个进程每一步的执行条件,将条件一一记录:生产者进程:生产一件产品的条件是有生产产品的原料,在题目中不曾提及,所以该条件不考虑,认为这一步骤没有限制条件;产品放入缓冲条件是要有产品、缓冲,由于前一步骤已经生产出产品,所以这一步骤执行是肯定有产品,这一步骤的限制条件是有缓冲;消费者进程:从缓冲中取走产品条件是缓冲中有产品和,这一步骤的限制条件是缓冲中的产品;消费产品的条件是应该是已获得产品,由于前一步骤已经获得产品,所以这一步骤执行
4、是肯定有产品的,所以这一步骤没有限制条件;第三步比较各个条件,将同一条件归为一个,设置一个信号量表示;根据第二步分析,本题中有四个限制条件:一个是缓冲,定义信号量empty;一个是产品,定义信号量full;15第四步设置信号量初值:empty,full是资源数量,系统初始状态应该是缓冲均空,无产品,所以empty=n,full=0。第五步重新分析每个进程的每个步骤,加入wait,signal操作:生产者进程:生产一件产品,无限制条件,且对上述四个信号量无影响;产品放入缓冲条件是缓冲,所以这条语句前加上wait(empty),这条语句执行完
5、后,应该缓冲中产品会增加一个,所以这条语句后应加入signal(full);消费者进程:从缓冲中取走产品条件是缓冲中有产品和无消费者从缓冲中取产品,所以这条语句前加上wait(full)),这条语句执行完后,缓冲会增加一个,所以这条语句后应加入signal(S1);消费产品无限制条件,且对上述四个信号量无影响。这样生产者和消费者进程的过程修改为:生产者进程L1:生产一件产品;wait(empty);产品放入缓冲;signal(full);gotoL1;消费者进程L2:wait(full);从缓冲中区走产品;signal(empty);消费
6、一件产品;gotoL2;用一个数组B描述缓冲,k指示放产品的位置,t指示取产品的位置,则完整的生产者消费者算法描述如下:semaphoreempty=n,full=0;itembuffer[n];intin=out=0;voidproducer(){while(1){…produceaniteminnextp;...wait(empty);buffer[in]=nextp;in=(in+1)modn;signal(full);}}15voidconsumer(){while(1){...wait(full);nextc=buffer[ou
7、t];out=(out+1)modn;signal(empty);...consumetheiteminnextc;…}}main(){cobegin{producer();consumer();}}第六步检查:其中wait(S1)和signal(S1)之间的程序段是各生产者的相关临界区,保证了生产者放产品的互斥;wait(S2)和signal(S2)之间的程序段是各消费者的相关临界区,保证了消费者的互斥;wait(empty)保证了有缓冲才可放产品,无缓冲时生产者等待;wait(full)保证了缓冲中有产品才可取产品,无产品时消费者等待
8、;signal(empty)让消费者通知系统释放一个缓冲,有生产者等待缓冲时可将其唤醒;signal(full)让通知生产者系统增加了一个产品,有消费者等待产品时可将其唤醒。符合题目要求,题目
此文档下载收益归作者所有