信号量机制-课堂练习.doc

上传人:鲁** 文档编号:544206876 上传时间:2023-08-18 格式:DOC 页数:15 大小:79.01KB
返回 下载 相关 举报
信号量机制-课堂练习.doc_第1页
第1页 / 共15页
信号量机制-课堂练习.doc_第2页
第2页 / 共15页
信号量机制-课堂练习.doc_第3页
第3页 / 共15页
信号量机制-课堂练习.doc_第4页
第4页 / 共15页
信号量机制-课堂练习.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《信号量机制-课堂练习.doc》由会员分享,可在线阅读,更多相关《信号量机制-课堂练习.doc(15页珍藏版)》请在金锄头文库上搜索。

1、用wait,signal操作解决进程的同步和互斥问题,绝大部分题目可以按以下步骤解决:根据题目要求将每个进程的执行过程一步一步描述出来;分析每个进程每一步的执行条件,将条件一一记录;比较各个条件,将同一条件归为一个,若条件可以归结为一种资源,设置一个信号量表示;注意:这里是做题,不是实现系统,所以若某个条件题目中没有加以说明或限制,则删除;设置信号量初值:若信号量是代表某种资源,则为系统初始时的可使用的资源数或可使用资源的进程数,若为互斥则为“1”;重新分析每个进程的每个步骤:若该步骤有执行条件涉及信号量A,则在该步骤语句前加入wait(A);若该步骤有执行后某个信号量B会增值,则在该步骤语句

2、后加入signal(B);注意:若某个步骤前同时有几个wait操作,则一般同步信号量在前,互斥信号量在后;题目已经做完,最后检查各个进程是否能按题目要求并发执行,若可以,停止;若不可以,检查上述过程,查找错误。例1 有一个生产者和一个消费者共享容量为n的缓冲器(n均大于1),生产者把生产的物品存入缓冲器,而消费者从缓冲器中取出物品去消费。要求用wait,signal操作对生产者和消费者进行正确管理。第一步 根据题目要求将每个进程的执行过程一步一步描述出来:生产者进程 L1: 生产一件产品;产品放入缓冲;goto L1;消费者进程 L2: 从缓冲中区走产品;消费一件产品;goto L2;第二步

3、分析每个进程每一步的执行条件,将条件一一记录:生产者进程:生产一件产品的条件是有生产产品的原料,在题目中不曾提及,所以该条件不考虑,认为这一步骤没有限制条件;产品放入缓冲条件是要有产品、缓冲,由于前一步骤已经生产出产品,所以这一步骤执行是肯定有产品,这一步骤的限制条件是有缓冲;消费者进程:从缓冲中取走产品条件是缓冲中有产品和,这一步骤的限制条件是缓冲中的产品;消费产品的条件是应该是已获得产品,由于前一步骤已经获得产品,所以这一步骤执行是肯定有产品的,所以这一步骤没有限制条件;第三步 比较各个条件,将同一条件归为一个,设置一个信号量表示;根据第二步分析,本题中有四个限制条件:一个是缓冲,定义信号

4、量empty;一个是产品,定义信号量full;第四步 设置信号量初值:empty,full是资源数量,系统初始状态应该是缓冲均空,无产品,所以empty=n,full=0。第五步 重新分析每个进程的每个步骤,加入wait,signal操作:生产者进程:生产一件产品,无限制条件,且对上述四个信号量无影响;产品放入缓冲条件是缓冲,所以这条语句前加上wait(empty),这条语句执行完后,应该缓冲中产品会增加一个,所以这条语句后应加入signal(full);消费者进程:从缓冲中取走产品条件是缓冲中有产品和无消费者从缓冲中取产品,所以这条语句前加上wait(full),这条语句执行完后,缓冲会增加

5、一个,所以这条语句后应加入signal(S1);消费产品无限制条件,且对上述四个信号量无影响。这样生产者和消费者进程的过程修改为:生产者进程 L1: 生产一件产品; wait(empty);产品放入缓冲;signal(full);goto L1;消费者进程 L2: wait(full);从缓冲中区走产品;signal(empty);消费一件产品;goto L2;用一个数组B描述缓冲,k指示放产品的位置,t指示取产品的位置,则完整的生产者消费者算法描述如下:semaphore empty=n,full=0;item buffern;int in=out=0;void producer() whi

6、le (1) produce an item in nextp; . wait(empty); bufferin=nextp; in=(in+1) mod n; signal(full); void consumer()while (1) . wait(full); nextc=bufferout; out=(out+1) mod n; signal(empty); . consume the item in nextc; main()cobegin producer();consumer(); 第六步 检查:其中wait(S1)和signal(S1)之间的程序段是各生产者的相关临界区,保证了

7、生产者放产品的互斥;wait(S2)和signal(S2)之间的程序段是各消费者的相关临界区,保证了消费者的互斥;wait(empty)保证了有缓冲才可放产品,无缓冲时生产者等待;wait(full)保证了缓冲中有产品才可取产品,无产品时消费者等待;signal(empty)让消费者通知系统释放一个缓冲,有生产者等待缓冲时可将其唤醒;signal(full)让通知生产者系统增加了一个产品,有消费者等待产品时可将其唤醒。符合题目要求,题目完成。例1改 有m个生产者和r个消费者共享容量为n的缓冲器(m,r,n均大于1),每个生产者都要把各自生产的物品存入缓冲器,而每个消费者也都要从缓冲器中取出物品

8、去消费。要求用wait,signal操作对这些生产者和消费者进行正确管理。在这个问题中生产者与消费者之间应该同步。由于没有限定生产者生产的物品供哪个消费者取用,也没有限制消费者只能取用哪些物品,因此,生产者只要测试到有缓冲器中尚未放满物品就可把生产的物品存入,消费者只要测试到缓冲器中有物品就可取出。下面是实现同步机制的过程。第一步 根据题目要求将每个进程的执行过程一步一步描述出来:生产者进程 L1: 生产一件产品;产品放入缓冲;goto L1;消费者进程 L2: 从缓冲中区走产品;消费一件产品;goto L2;第二步 分析每个进程每一步的执行条件,将条件一一记录:生产者进程:生产一件产品的条件

9、是有生产产品的原料,在题目中不曾提及,所以该条件不考虑,认为这一步骤没有限制条件;产品放入缓冲条件是要有产品、缓冲和无生产者向缓冲中放产品,由于前一步骤已经生产出产品,所以这一步骤执行是肯定有产品,这一步骤的限制条件是有缓冲和无生产者向缓冲中放产品;消费者进程:从缓冲中取走产品条件是缓冲中有产品和无消费者从缓冲中取产品,这一步骤的限制条件是缓冲中的产品和无消费者从缓冲中取产品;消费产品的条件是应该是已获得产品,由于前一步骤已经获得产品,所以这一步骤执行是肯定有产品的,所以这一步骤没有限制条件;第三步 比较各个条件,将同一条件归为一个,设置一个信号量表示;根据第二步分析,本题中有四个限制条件:一

10、个是缓冲,定义信号量empty;一个是无生产者向缓冲中放产品,定义信号量mutex1;一个是产品,定义信号量full;一个是无消费者从缓冲中取产品,定义信号量mutex2。第四步 设置信号量初值:mutex1,mutex2是互斥信号量,每次只能由一个生产者(或消费者)向缓冲中放产品(取产品),所以初值均为“1”;empty,full是资源数量,系统初始状态应该是缓冲均空,无产品,所以empty=n,full=0。第五步 重新分析每个进程的每个步骤,加入wait,signal操作:生产者进程:生产一件产品,无限制条件,且对上述四个信号量无影响;产品放入缓冲条件是缓冲和无生产者向缓冲中放产品,所以

11、这条语句前加上wait(empty)、wait(mutex1),这条语句执行完后,应该释放互斥信号量mutex1和缓冲中产品会增加一个,所以这条语句后应加入signal(mutex1)、signal(full);消费者进程:从缓冲中取走产品条件是缓冲中有产品和无消费者从缓冲中取产品,所以这条语句前加上wait(full)、wait(mutex2),这条语句执行完后,应该释放互斥信号量mutex2和缓冲中产品少了一个,缓冲会增加一个,所以这条语句后应加入signal(mutex1)、signal(empty);消费产品无限制条件,且对上述四个信号量无影响。这样生产者和消费者进程的过程修改为:生产

12、者进程 L1: 生产一件产品; wait(empty); wait(mutex1);产品放入缓冲;signal(mutex1);signal(full);goto L1;消费者进程 L2: wait(full); wait(mutex2);从缓冲中区走产品;signal(mutex2);signal(empty);消费一件产品;goto L2;用一个数组B描述缓冲,k指示放产品的位置,t指示取产品的位置,则完整的生产者消费者算法描述如下:semaphore mutex=1,empty=n,full=0;item buffern;int in=out=0;void producer() whil

13、e (1) produce an item in nextp; . wait(empty); wait(mutex); bufferin=nextp; in=(in+1) mod n; signal(mutex); signal(full); void consumer()while (1) . wait(full); wait(mutex); nextc=bufferout; out=(out+1) mod n; signal(mutex); signal(empty); . consume the item in nextc; main()cobegin producer();consum

14、er(); 第六步 检查:其中wait(mutex1)和signal(mutex1)之间的程序段是各生产者的相关临界区,保证了生产者放产品的互斥;wait(mutex2)和signal(mutex2)之间的程序段是各消费者的相关临界区,保证了消费者的互斥;wait(empty)保证了有缓冲才可放产品,无缓冲时生产者等待;wait(full)保证了缓冲中有产品才可取产品,无产品时消费者等待;signal(empty)让消费者通知系统释放一个缓冲,有生产者等待缓冲时可将其唤醒;signal(full)让通知生产者系统增加了一个产品,有消费者等待产品时可将其唤醒。符合题目要求,题目完成。例2 现有四个进程R1、R2、W1、W2,它们共享可以存放一个数的缓冲器B。进程R1每次把来自键盘的一个数存入缓冲器B中,供进程W1打印输出;进程R2每次从磁盘上读一个数存放到缓冲器B中,供进程W2打印输出。为防止数据的丢失和重复打印,问怎样用wait,signal操作来协调这四个进程的并发执行。第一步 根据题目要求将每个进程的执行过程一步一步描述出来:进程R1:Ll: 接收来自键盘

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号