操作系统第2部分进程死锁及经典问题31104.pptVIP

操作系统第2部分进程死锁及经典问题31104.ppt

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

经典进程互斥与同步问题 生产者/消费者问题 读者/写者问题 哲学家就餐问题 2.6 生产者/消费者问题 生产者与消费者是一个广义的概念,可以代表一类具有相同属性的进程。 生产者和消费者进程共享一个大小固定的缓冲区,其中,一个或多个生产者生产数据,并将生产的数据存入缓冲区,并有一个消费者从缓冲区中取数据。 假设缓冲区的大小为n(存储单元的个数),它可以被生产者和消费者循环使用。 分别设置两个指针in和out,指向生产者将存放数据的存储单元和消费者将取数据的存储单元,如图 ?不控制生产者/消费者 指针in和out初始化指向缓冲区的第一个存储单元。 生产者通过in指针向存储单元存放数据,一次存放一条数据,且in指针向后移一个位置。 消费者从缓冲区中逐条取走数据,一次取一条数据,相应的存储单元变为“空”。每取走一条数据,out指针向后移一个存储单元位置。 试想,如果不控制生产者与消费者,将会产生什么结果? 生产者/消费者必须互斥 生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储单元,将导致执行结果不确定。 这显然是不允许的。必须使生产者和消费者互斥进入缓冲区。即,某时刻只允许一个实体(生产者或消费者)访问缓冲区,生产者互斥消费者和其它任何生产者。 生产者/消费者必须同步 生产者不能向满缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。 利用信号量实现生产者/消费者同步与互斥 注意 进程应该先申请资源信号量,再申请互斥信号量,顺序不能颠倒。 对任何信号量的semWait与semSignal操作必须配对。同一进程中的多对semWait与semSignal语句只能嵌套,不能交叉。 对同一个信号量的semWait与semSignal可以不在同一个进程中。 semWait与semSignal语句不能颠倒顺序,semWait语句一定先于semSignal语句。 2.7 读者/写者问题 问题描述 该问题为多个进程访问一个共享数据区,如数据库、文件、内存区及一组寄存器等的数据问题建立了一个通用模型,其中若干读进程只能读数据,若干写进程只能写数据。 例如,一个联网售票系统,数据的查询和更新非常频繁,不可避免会出现多个进程试图查询或修改(读/写)其中某一条数据的情形。多个进程同时读一条记录是可以的,但如果一个进程正在更新数据库中的某条记录,则所有其他进程都不能访问(读或写)该记录,否则可能会将同一个座位销售多次。 读者/写者进程满足的条件 允许多个读者进程可以同时读数据; 不允许多个写者进程同时写数据,即只能互斥写数据; 若有写者进程正在写数据,则不允许读者进程读数据。 如何控制读者和写者? 如果采用生产者/消费者问题解决方法,严格互斥任何读者和写者进程,可以保证数据更新操作的正确性。 但是,对于若干读者进程,只不过希望查询售票情况,却被严格互斥,严重影响了系统效率。显然应该让多个读者同时读数据。 如果一个写者进程正在修改数据,别的写者以及任何读者都不能访问该数据。 读者优先 当一个读者正在读数据时,另一个读者也需要读数据,应允许第二个读者进入,同理第三个及随后更多的读者都被允许进入。 现在假设一个写者到来,由于写操作是排他的,所以它不能访问数据,需要阻塞等待。如果一直都有新的读者陆续到来,写者的写操作将被严重推迟。 该方法称为“读者优先”。即,一旦有读者正在读数据,允许多个读者同时进入读数据,只有当全部读者退出,才允许写者进入写数据。用信号量实现的具体过程见图 写者优先 为了防止“读者优先”可能导致写者饥饿,可以考虑写者优先。 即,当共享数据区被读者占用时,后续紧邻到达的读者可以继续进入,若这时有一个写者到来且阻塞等待,则写者后面到来的若干读者全部阻塞等待。 换句话说,只要有一个写者申请写数据,则不再允许新的读者进入读数据。这样,写者只需等待先于它到来的读者完成其读数据任务,而不用等待其后到来的读者。 这种方案解决了写者饥饿问题,但降低了并发程度,使系统的性能较差 写进程具有优先权 写进程具有优先权 2.8 互斥与同步解决方法之四管程 管程是一种在程序设计级控制进程互斥与同步的机制,具有信号量的功能,且更容易使用和控制。 目前已有很多程序设计语言支持管程机制,如并发Pascal、Pascal_Plus、Modula-2、Modula-3、Java等,并且还作为程序库提供服务。 利用管程可以锁定任何对象,尤其是链表型数据结构,可以锁定整个链表,或链表中的某个元素。 管程的结构 管程是由过程、变量及数据结构等组成的集合。典型的管程包括三个部分: ①对局部于管程的共享数据结构的说明; ②对该数据结构进行操作的一组过程; ③对该数据结构初始化的语句。 管程有

文档评论(0)

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

分享好文档!

1亿VIP精品文档

相关文档