网站大量收购独家精品文档,联系QQ:2885784924

清华大学操作系统讲义第04讲-经典IPC问题.pptVIP

清华大学操作系统讲义第04讲-经典IPC问题.ppt

  1. 1、本文档共65页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
清华大学操作系统讲义第04讲-经典IPC问题

下次课将介绍进程的调度 问题,请提前预习相关的 内容,即教材上的第2.5 小节。 下 课 啦 ! void philosopher(int i) // i的取值:0到N-1 { while(TRUE) // 封闭式开发,一直循环 { think( ); // 思考中… take_forks(i); // 拿到两把叉子或被阻塞 eat( ); // 吃面条中… put_forks(i); // 把两把叉子放回原处 } } 函数philosopher的定义 S1 S2–S4 S5 S6–S7 // 功能:要么拿到两把叉子,要么被阻塞起来。 void take_forks(int i) // i的取值:0到N-1 { P(mutex); // 进入临界区 state[i] = HUNGRY; // 我饿了! test(i); // 试图拿两把叉子 V(mutex); // 退出临界区 P(s[i]); // 没有叉子便阻塞 } 函数take_forks的定义 void test(int i) // i的取值:0到N-1 { if(state[i] == HUNGRY state[LEFT] != EATING state[RIGHT] != EATING) { state[i] = EATING; // 两把叉子到手 V(s[i]); // 第i人可以吃饭了 } } 函数test的定义 // 功能:把两把叉子放回原处,并在需要的时候, // 去唤醒左邻右舍。 void put_forks(int i) // i的取值:0到N-1 { P(mutex); // 进入临界区 state[i] = THINKING; // 交出两把叉子 test(LEFT); // 看左邻居能否进餐 test(RIGHT); // 看右邻居能否进餐 V(mutex); // 退出临界区 } 函数put_forks的定义 2.4.3 读者—写者问题 在一个航空定票系统当中,有很多个竞争的 进程想要访问(读、写)系统的数据库。访 问规则是:在任何时候,可以允许多个进程 同时来读,但如果有一个进程想要更新 (写) 该数据库,则其他的任何进程都不能访问, 包括读者和写者。问题是:怎么样来编程实 现读者和写者。 问题描述 问题分析 任何时候“写者”最多只允许一个,而“读者” 可以有多个: “读—写”是互斥的; “写—写”是互斥的; “读—读”是允许的; 基于读者优先策略的方法 假设读者来: 1)若有其它读者在读,则不论是否有写者在等, 新读者都可以读(读者优先); 2)若无读者、写者,则新读者也可以读; 3)若无读者,且有写者在写,则新读者等待; 假设写者来: 1)若有读者,则新写者等待; 2)若有其它写者,则新写者等待; 3)若无读者和写者,则新写者可以写; 需要设置一个计数器rc,用来记录并发 运行的读者个数; 对于各个读者而言,该计数器是一个临 界资源,对它的访问必须互斥进行,因 此设置一个互斥信号量S_mutex; 对于各个写者而言、写者与所有的读者 而言,数据库是一个临界资源,对它的 访问必须互斥地进行,因此设置一个互 斥信号量S_db。 int rc = 0; // 并发读者的个数 semaphore S_mutex; // 对rc的互斥信号量,初值1 semaphore S_db; // 对数据库的信号量,初值1 读者—写者问题的一个解答 void writer(void) { while(TRUE) { think_up_data( ); // 生成数据,非临界区 P(S_db); // 希望访问数据库 write_data_base( ); // 更新数据库 V(S_db); // 退出临界区 } } void reader(void) { while(TRUE) { P(S_mutex); // 互斥地访问计数器rc rc ++; // 新增了一个读者 if(rc == 1) P(S_db); // 如果是第一个读者…

您可能关注的文档

文档评论(0)

zijingling + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档