IPC经典问题761资料讲解.ppt

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IPC经典问题;第一类:读者优先;第一类读者写者问题的解法;(2)哲学家就餐问题;哲学家就餐问题解法(1);为防止死锁发生可采取的措施: 最多允许4个哲学家同时坐在桌子周围 仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子(?) 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之 为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,并且一次拿到两只筷子,否则不拿;哲学家就餐问题解法(2);void test(int i) { if (state[ i ] == HUNGRY) && (state [ (i-1) % 5] != EATING) && (state [ (i+1) % 5] != EATING) { state[ i ] = EATING; V(&s[ i ]); } };void philosopher (int i) { while (true) { 思考; P(&mutex); state[i] = HUNGRY; test(i); V(&mutex); P(&s[i]); 拿左筷子; 拿右筷子; 进食;;5.进程的同步机制──管程;(2)不利于修改和维护,因为程序的局部性很差,所以任一组变量或一段代码的修改都可能影响全局 (3)正确性难以保证,因为操作系统或并发程序通常很大,要保证这样一个复杂的系统没有逻辑错误是很难的 Dijkstra(1971):“秘书”进程 Hansen和Hoare(1973):管程;管程:一种同步机制 (管程-类程-进程) 管程定义: 指关于共享资源的数据及在其上操作的一组过程或共享数据结构及其规定的所有操作 系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,同时分析了共享资源和专用资源在管理上的差别,按不同的管理方式定义模块的类型和结构,使同步操作相对集中,从而增加了模块的相对独立性 ;管程的形式;FUNCTION 函数名(形参表):值类型; 函数局部变量说明; BEGIN 语句序列; END; ...... BEGIN 共享变量初始化语句序列; END; 管程的四个组成部分: 名称 数据结构说明 对该数据结构进行操作的一组过程/函数 初始化语句;(一)模块化,一个管程是一个基本程序单位,可以单独编译 (二)抽象数据类型,管程是一种特殊的数据类型,其中不仅有数据,而且有对数据??行操作的代码 (三)信息掩蔽,管程是半透明的,管程中的外部过程(函数)实现了某些功能,至于这些功能是怎样实现的,在其外部则是不可见的; 管程有如下几个要素: (一)管程中的共享变量在管程外部是不可见的,外部只能通过调用管程中所说明的外部过程(函数)来间接地访问管程中的共享变量 (二)为了保证管程共享变量的数据完整性,规定管程互斥进入 (三)管程通常是用来管理资源的,因而在管程中应当设有进程等待队以及相应的等待及唤醒操作; 问题:多个进程出现在管程中 当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权;当一个进入管程的进程执行唤醒操作时(如P唤醒Q),管程中便存在两个同时处于活动状态的进程 处理方法有三种: P等待Q继续,直到Q退出或等待√(Hoare) Q等待P继续,直到P等待或退出 规定唤醒为管程中最后一个可执行的操作; 因为管程是互斥进入的,所以当一个进程试图进入一个巳被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列 如果进程P唤醒进程Q,则P等待Q继续,如果进程Q在执行又唤醒进程R,则Q等待R继续,……,如此,在管程内部,由于执行唤醒操作,可能会出现多个等待进程,因而还需要有一个进程等待队列,这个等待队列被称为紧急等待队列。它的优先级应当高于入口等待队列的优先级; 由于管程通常是用于管理资源的,因而在管程内部,应当存在某种等待机制。当进入管程的进程因资源被占用等原因不能继续运行时使其等待。为此在管程内部可以说明和使用一种特殊类型的变量,称作条件变量: VAR C:condition; 对于条件型变量,可以执行wait和signal操作:;wait(c):如果紧急等待队列非空,则唤醒第一个等待者;否则释放管程的互斥权,执行此操作的进程的PCB进入c链尾部 signal(c):如果c链为空,则相当于空操作,执行此操作的进程继续;否则唤醒

文档评论(0)

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

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

1亿VIP精品文档

相关文档