- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 11
用wait,signal操作解决进程的同步和互斥问题,绝大部分题目可以按以下步骤解决:
⑴根据题目要求将每个进程的执行过程一步一步描述出来;
⑵分析每个进程每一步的执行条件,将条件一一记录;
⑶比较各个条件,将同一条件归为一个,若条件可以归结为一种资源,设置一个信号量表示;
注意:这里是做题,不是实现系统,所以若某个条件题目中没有加以说明或限制,则删除;
⑷设置信号量初值:若信号量是代表某种资源,则为系统初始时的可使用的资源数或可使用资源的进程数,若为互斥则为“1”;
⑸重新分析每个进程的每个步骤:若该步骤有执行条件涉及信号量A,则在该步骤语句前加入wait(A);若该步骤有执行后某个信号量B会增值,则在该步骤语句后加入signal(B);
注意:若某个步骤前同时有几个wait操作,则一般同步信号量在前,互斥信号量在后;
⑹题目已经做完,最后检查各个进程是否能按题目要求并发执行,若可以,停止;若不可以,检查上述过程,查找错误。
例1 有一个生产者和一个消费者共享容量为n的缓冲器(n均大于1),生产者把生产的物品存入缓冲器,而消费者从缓冲器中取出物品去消费。要求用wait,signal操作对生产者和消费者进行正确管理。
第一步 根据题目要求将每个进程的执行过程一步一步描述出来:
生产者进程
L1: 生产一件产品;
产品放入缓冲;
goto L1;
消费者进程
L2: 从缓冲中区走产品;
消费一件产品;
goto L2;
第二步 分析每个进程每一步的执行条件,将条件一一记录:
生产者进程:
生产一件产品的条件是有生产产品的原料,在题目中不曾提及,所以该条件不考虑,认为这一步骤没有限制条件;
产品放入缓冲条件是要有产品、缓冲,由于前一步骤已经生产出产品,所以这一步骤执行是肯定有产品,这一步骤的限制条件是有缓冲;
消费者进程:
从缓冲中取走产品条件是缓冲中有产品和,这一步骤的限制条件是缓冲中的产品;
消费产品的条件是应该是已获得产品,由于前一步骤已经获得产品,所以这一步骤执行是肯定有产品的,所以这一步骤没有限制条件;
第三步 比较各个条件,将同一条件归为一个,设置一个信号量表示;
根据第二步分析,本题中有四个限制条件:
一个是缓冲,定义信号量empty;
一个是产品,定义信号量full;
第四步 设置信号量初值:
empty,full是资源数量,系统初始状态应该是缓冲均空,无产品,所以empty=n,full=0。
第五步 重新分析每个进程的每个步骤,加入wait,signal操作:
生产者进程:
生产一件产品,无限制条件,且对上述四个信号量无影响;
产品放入缓冲条件是缓冲,所以这条语句前加上wait(empty),这条语句执行完后,应该缓冲中产品会增加一个,所以这条语句后应加入signal(full);
消费者进程:
从缓冲中取走产品条件是缓冲中有产品和无消费者从缓冲中取产品,所以这条语句前加上wait(full)),这条语句执行完后,缓冲会增加一个,所以这条语句后应加入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 buffer[n];
int in=out=0;
void producer()
{
while (1)
{
…
produce an item in nextp;
...
wait(empty);
buffer[in]=nextp;
in=(in+1) mod n;
signal(full);
}
}
void consumer()
{
while (1)
{
...
wait(full);
nextc=buffer[out];
out=(out+1) mod n;
signal(empty);
...
consume the item in nextc;
…
}
}
main()
{
cobegin {
producer();
consumer();
}
}
第六步 检查:
其中wait(S1)和signal(S1)之间的程序段是各生产者的相关临界区
原创力文档


文档评论(0)