第二章 进 程 管 理.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
注意:block原语和wakeup原语是一对作用刚好相反的原语。因此,如果在某进程中调用了阻塞原语,则必须在与之相合作的另一进程中或其他相关的进程中安排唤醒原语,以能唤醒阻塞进程;否则,被阻塞进程将会因不能被唤醒而长久地处于阻塞状态,从而再无机会继续运行。 在临界区前面增加一段代码,对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。把这段代码称为进入区(entry section)。 相应地,在临界区后面也要加上一段称为退出区(exit section)的代码,用于将临界区正被访问的标志恢复为未被访问的标志。 Var empty, full: semaphore :=1, 0; buffer: array[1] of item; Begin Parbegin producer : begin repeat wait(empty); putdata; signal(full); until false; end consumer : begin repeat wait(full); getdata; signal(empty); until false; end Parend End 说明:对资源信号量empty和full的wait和signal操作,同样需要成对地出现,但处于不同的程序中。 Var mutex, empty, full: semaphore :=1, 1, 0; buffer: array[1] of item; Begin Parbegin producer : begin repeat wait(empty); wait(mutex); putdata; signal (mutex); signal(full); until false; end consumer : begin repeat wait(full); wait(mutex); getdata; signal (mutex); signal(empty); until false; end Parend End 说明: (1)在生产者进程和消费者进程中,Signal操作的次序无关紧要,但两个Wait操作的次序却不能颠倒,否则可能导致死锁,即,应先执行对资源信号量的wait操作,再执行对互斥信号量的wait操作,这一点要特别注意。 (2)由于buffer只有一个,full和empty就可以保证对buffer的互斥操作,故mutex也可以省略,但如果buffer有多个,则mutex不能省略。 一般意义的“生产者—消费者”问题: N个buffer,多个生产者,多个消费者,循环存取buffer。这就是一般意义的“生产者—消费者”问题。 至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。 定义信号量count,只允许4个哲学家同时进餐,这样就能保证至少有一个哲学家可以就餐。 semaphore chopstick[5]={1,1,1,1,1}; semaphore count=4; void philosopher(int i) { while(true) { think(); wait(count); //请求进入房间进餐 wait(chopstick[i]); //请求左手边的筷子 wait(chopstick[(i+1)%5]); //请求右手边的筷子 eat(); signal(chopstic

文档评论(0)

神话 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5203223011000000

1亿VIP精品文档

相关文档