06 2 经典同步问题1.ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
06 2 经典同步问题1

操作系统 练习:公交车问题 在公共汽车上有司机和售票员 司机的活动: 启动车辆 正常运行 到站停车 售票员的活动 上下乘客 关车门 售票 开车门 上下乘客 条件1:司机必须等售票员关车门后才能启动车辆 条件2:售票员必须等司机停车后才能开车门 请设计程序,使用记录型信号量实现两人的同步合作 练习:公交车问题 司机和售票员两个角色 两个进程driver和busman 条件1:关车门(b)?启动车辆(d) 设置信号量S1对应司机能否启动车辆 S1的检查在司机进程,开锁在售票员进程 条件2:到站停车(d)?开车门(b) 设置信号量S2对应售票员能否开车门 S2的检查在售票员进程,开锁在司机进程 2.4 经典进程的同步问题 2.4.1 生产者—消费者问题 生产者—消费者问题是相互合作的进程关系的一种抽象,该问题有很大的代表性及实用价值 输入时,输入进程是生产者,计算进程是消费者; 输出时,计算进程是生产者,打印进程是消费者 2.4 经典进程的同步问题 未加信号量的生产者—消费者程序 producer: repeat … produce an item in nextp; … while counter=n do no-op; buffer[in]∶ =nextp; in∶ =in+1 mod n; counter∶ =counter+1; until false; consumer: repeat while counter=0 do no-op; nextc∶ =buffer[out]; out∶ =(out+1) mod n; counter∶ =counter-1; consumer the item in nextc; until false; 2.4 经典进程的同步问题 采用互斥型信号量解决生产者—消费者问题 Var mutex : semaphore∶ =1; producer: repeat consumer: repeat … … wait (mutex); wait (mutex); counter∶ =counter+1; counter∶ =counter-1; signal (mutex); signal (mutex); … … 上述信号量mutex,只是保证了对缓冲区的互斥操作 未实现两种限制情况 缓冲池全满则生产者阻塞 缓冲池全空则消费者阻塞 原有的counter是一个整数变量,非信号量,阻塞队列不能挂靠在counter对应的队列中 2.4 经典进程的同步问题 利用记录型信号量解决生产者—消费者问题 具有n个缓冲区公用缓冲池 互斥信号量mutex实现诸进程对缓冲池的互斥使用 信号量empty表示缓冲池中空缓冲区数量。 信号量full表示缓冲池中满缓冲区的数量。 mutex为公用信号量,full与empty与私用信号量 缓冲池未满,生产者可以将消息送入缓冲池 缓冲池未空,消费者可以从缓冲池中取走消息 2.4 经典进程的同步问题 加入记录型信号量的生产者—消费者程序 Var mutex, empty, full:semaphore∶=1,n,0; buffer:array[0, …, n-1] of item; in, out: integer∶=0, 0; mutex=1,用于互斥 empty=n,缓冲池初始化是全空 full=0,若消费者进程先启动,则进入阻塞状态等待生产者 2.4 经典进程的同步问题 加入记录型信号量的生产者—消费者程序 proceducer:begin consumer:begin repeat repeat producer an item nextp; … wait(empty); wait(full); wait(mutex); wait(mutex); buffer(in)∶=nextp; nextc∶ =buffer(out); in∶=(in+1) mod n; out∶ =(out+1) mod n; signal(mutex); signal(mutex); signal(full); signal(empty); until false;

文档评论(0)

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

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

1亿VIP精品文档

相关文档