第4章 调度与死锁_2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(a)可能死锁
(b)死锁
产生死锁的原因
进程P 进程 …… get(A); …… get(B); …… release(A); …… release(B); ……
●资源数
A、B分别代 表某种资源 进程Q 进程 …… get(B); …… get(A); …… release(B); …… release(A); ……
存在安全序列<P2,P1,P3> 存在安全序列
安全状态
——实例
系统有三个进程P1、 、 ,共有12台磁带机 台磁带机, 系统有三个进程 、P2、P3,共有 台磁带机,进程 P1要求 台,P2要求 台,P3要求 台。在T0时刻, 要求10台 要求4台 要求9台 时刻, 要求 要求 要求 时刻 进程P1、 、 已获得 已获得7、 、 台 尚有1台未分配 台未分配, 进程 、P2、P3已获得 、2、2台,尚有 台未分配, 系统是否处于安全状态? 问:系统是否处于安全状态? 进程 P1 P2 P3 最大需求 10 4 9 已分配 7 2 2 可用 1
避免死锁是通过明智的选择, 避免死锁是通过明智的选择,确保系统永远不会 即动态地决定是否分配资源给进程! 到达死锁点 。即动态地决定是否分配资源给进程! 安全状态—与—不安全状态 安全状态 不安全状态
●安全状态是指系统至少存在一个安全序列 安全状态是指系统至少存在一个安全序列
<P1, P2, …, Pn>,按照这个序列为进程分配 ,按照这个序列为进程分配 资源,直到满足最大需求, 资源,直到满足最大需求,每个进程都可顺 序完成。 序完成。 若系统不存在这样一个安全序列, ●若系统不存在这样一个安全序列,则系统处 于不安全状态。 于不安全状态。
生产者运行N次后——死锁 生产者运行N次后——死锁! 死锁!
产生死锁的四个必要条件
互斥条件
请求保持条件
不剥夺条件
环路条件
●
4.4死锁的预防与避免 死锁的预防与避免
死锁的预防
互斥条件不可禁止 去掉“请求保持条件” 去掉“请求保持条件”
采用预先静态分配方法
– 系统要求所有进程一次性地申请其所需的全部资源
银行家算法
2.安全检测算法 安全检测算法 (1)设置两个向量: 设置两个向量: 设置两个向量 工作向量Work: 表示系统可提供给进程继续运行所需的各类资源 ① 工作向量 数目,它含有m个元素 初始时, 个元素。 数目,它含有 个元素。初始时,Work[*] =Available[*]; 表示系统是否有足够的资源分配给某进程, ② Finish: 表示系统是否有足够的资源分配给某进程,使之运行完成 初始时Finish[i]=false; 当有足够资源分配给进程时 , 令 Finish[i] 当有足够资源分配给进程时, 。 初始时 [] [] =true。 。 (2)从进程集合中找到一个能满足下述条件的进程: 从进程集合中找到一个能满足下述条件的进程: 从进程集合中找到一个能满足下述条件的进程 ① Finish[i]=false; [] ② Need[i,*]≤Work[*]; [ ] [ ] 若找到, 则执行步骤(3), 否则,执行步骤(4)。 若找到, 则执行步骤 , 否则,执行步骤 。 (3)当进程 获得资源后 , 可顺利执行 , 直至完成 , 并释放出分配给它 当进程Pi获得资源后 可顺利执行,直至完成, 当进程 获得资源后, 的资源,故应执行: 的资源,故应执行: ① Work[*]=Work[*]+Allocation[i, *]; [ ] [ ] [ ] ② Finish[i]=true; [] 返回步骤( 返回步骤 2); (4)如果所有进程的 如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态 都满足, 如果所有进程的 [] 都满足 否则,系统处于不安全状态。 ;否则,系统处于不安全状态。
消费者先行 死锁! 死锁!
问题的提出:对于生产者 消费者问题 消费者问题, 问题的提出:对于生产者-消费者问题,如果 操作的位置交换, 将P操作的位置交换,将产生什么样的后果? 操作的位置交换 将产生什么样的后果?
交换P操作的位置 交换 操作的位置
void producer() //生产者进程 生产者进程 {while (true) {produce an item in data_p; P(mutex); P(empty); buffer[i] = data_p; i = (i + 1) % n; V(mutex); V(full); } } void consumer()//消费者进程 消费者进程 {while (true) {P(full); P(mutex); data_c = buffer[j]; j = (j + 1) % n; V(mutex); V(empty); consume the item in data_c; } }
< 要求该种资源的进程数 ●进程的推进顺序非法
进程的推进顺序不当
进程Q 释放A P和Q都想要A 释放B 死锁 地带 申请A
y
(1) (2)
●(1)、(2) 、 、
(4) 、(5) 正常运行
●(3) 、(6)
P和Q都想要B
(3) (6) (5) (4) x
申请A 申请B 释放A 释放B 进程P
发生死锁
不存在安全序列, 不存在安全序列,系统处于不安全状态
死锁的避免
●不安全状态:可能死锁 不安全状态: ●安全状态:一定能避免死锁 安全状态:
避免死锁的实质 ——如何使系统不进入不安全状态 如何使系统不进入不安全状态
银行家算法
数据结构定义
最著名的避免死锁的策略
系统中每种资源的总量 没有分配的每种资源总量 每个进程对每种资源的最大需求 Mij:第i个进程对第 种资源的最大需求 个进程对第j种资源的最大需求 第 个进程对第
Resource = (R1, R2, … ,Rm) Available = (V1, V2, … ,Vm)
Max =
M11 M12 … M1m M21 M22 … M2m …… …… Mn1 Mn2 … Mnm C11 C12 … C1m C21 C22 … C2m …… …… Cn1 Cn2 … Cnm A11 A12 … A1m A21 A22 … A2m …… …… An1 An2 … Anm
优点: 优点:
– 方法简单
缺点: 缺点:
– 进程延迟运行 – 资源浪费 – 用户有时提不出他要使用的全部资源
●
4.4死锁的预防与避免 死锁的预防与避免
死锁的预防 方法
互斥条件不可禁止 去掉“请求保持条件” 去掉“请求保持条件”
–占有某些资源的进程,当它有新的资源请求被拒绝时, 占有某些资源的进程,当它有新的资源请求被拒绝时, 占有某些资源的进程 该进程停止运行,并释放它所占有的资源。当它再次 该进程停止运行,并释放它所占有的资源。 被执行时,重新申请资源。 被执行时,重新申请资源。 –如果一个进程请求另一个进程占有的资源,操作系统 如果一个进程请求另一个进程占有的资源, 如果一个进程请求另一个进程占有的资源 可以剥夺后者占有的资源, 可以剥夺后者占有的资源,要求它释放资源并将资源 分配给前者使用
Need =
每个进程尚需的每种资源的数量
Allocation =
当前分配情况
银行家算法
分成两部分: ★银行家算法 分成两部分: 1.资源请求 ,进行资源预分配 资源请求 2.安全检测,若安全则真正资源分配,若不安全则回到预分配前的状态 安全检测, 安全检测 若安全则真正资源分配, 1.资源请求 资源请求 假设进程Pi提出资源请求 假设进程 提出资源请求 (1)如果 如果Request[*]≤Need[i, *],便转向步骤 ; 如果 [ ] [ ] 便转向步骤2; 否则认为出错, 因为它所请求的资源数已超过它所宣布需要的最大值。 否则认为出错, 因为它所请求的资源数已超过它所宣布需要的最大值。 (2)如果 (2)如果Request[*]≤Available[*],便转向步骤(3); 如果Request[*]≤Available[*] 便转向步骤(3); 否则, 表示尚无足够资源, 须等待 须等待。 否则, 表示尚无足够资源,Pi须等待。 (3)假定系统可以把资源分配给进程 , 并修改下面数据结构中的数值 假定系统可以把资源分配给进程 假定 系统可以把资源分配给进程Pi, :
去掉“环路“ 去掉“环路“条件
去掉“不剥夺条件” 去掉“不剥夺条件”
●
4.4死锁的预防与避免 死锁的预防与避免
死锁的预防
互斥条件不可禁止 去掉“请求保持条件” 去掉“请求保持条件”
死锁的预防措施低效! 死锁的预防措施低效!
去掉“环路“ 去掉“环路“条件
去掉“不剥夺条件” 去掉“不剥夺条件”
死锁的避免
安全状态
——实例
系统有三个进程P1、 、 ,共有12台磁带机 台磁带机, 系统有三个进程 、P2、P3,共有 台磁带机,进程 P1要求 台,P2要求 台,P3要求 台。在T0时刻, 要求10台 要求4台 要求9台 时刻, 要求 要求 要求 时刻 进程P1、 、 已获得 已获得5、 、 台 尚有3台未分配 台未分配, 进程 、P2、P3已获得 、2、2台,尚有 台未分配, 系统是否处于安全状态? 问:系统是否处于安全状态? 进程 P1 P2 P3 最大需求 10 4 9 已分配 5 2 2 可用 3
申请B
进程的推进顺序合适
进程Q 释放A P和Q都 想要A 释放B
y
(1) (2) (6) (3)
申请A P和Q都 想要B
进程P对 进程 对 资源的申 请、释放 次序改变 后不死锁! 后不死锁!
(5) (4) x
申请B
Baidu Nhomakorabea
申请A
释放A
申请B
释放B
进程P
交换P操作的位置 交换 操作的位置
void producer() //生产者进程 生产者进程 {while (true) {produce an item in data_p; P(empty); P(mutex); buffer[i] = data_p; i = (i + 1) % n; V(mutex); V(full);} } void consumer()//消费者进程 消费者进程 {while (true) {P(mutex); P(full); data_c = buffer[j]; j = (j + 1) % n; V(mutex); V(empty); consume the item in data_c;} }
Allocation[i, *]=Allocation[i, *]+Request[*]; [ ] [ ] [ ]
Available[*]=Available[*]-Request[*]; [ ] [ ] [ ] Need[i, *]=Need[i, *]-Request[*]; [ ] [ ] [ ] (4)系统执行安全检测算法, 检查此次资源分配后 , 系统是否处于安全 系统执行安全检测算法, 系统执行安全检测算法 检查此次资源分配后, 状态。若安全, 才正式将资源分配给进程Pi, 以完成本次分配; 否则, 状态 。 若安全 , 才正式将资源分配给进程 , 以完成本次分配 ; 否则 , 将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待 等待。 将本次的试探分配作废,恢复原来的资源分配状态,让进程 等待。
●
4.4死锁的预防与避免 死锁的预防与避免
死锁的预防 采用资源的有序分配
互斥条件不可禁止 去掉“请求保持条件” 去掉“请求保持条件”
– 令所有资源排队,并赋予不同的序号。当进程请求 令所有资源排队,并赋予不同的序号。 资源时,必须严格按递增的次序提出, 资源时,必须严格按递增的次序提出,从而消除了 环路。 环路。 缺点: 缺点: – 定好序号后,增加新设备类型受到限制。 定好序号后,增加新设备类型受到限制。 – 尽管定序号时考虑大多数作业使用资源的顺序。但 尽管定序号时考虑大多数作业使用资源的顺序。 会发生使用顺序与规定顺序不一致的情况, 会发生使用顺序与规定顺序不一致的情况,造成资 源浪费。 源浪费。 –限制用户简单、自主地编程 。 限制用户简单、 限制用户简单
第4 章
调度与死锁
●调度类型与准则
本章要点
●调度算法
●死锁的基本概念 ●死锁的预防与避免 ●死锁的检测与解除
●
4.3 死锁的基本概念
一组竞争系统资源或相互通信的进程相互的“永久” 一组竞争系统资源或相互通信的进程相互的“永久” 阻塞。若无外力作用,这组进程将永远不能继续执行。 阻塞。若无外力作用,这组进程将永远不能继续执行。
缺点
– 该策略实现起来比较复杂,而且要付出很大代价。 该策略实现起来比较复杂,而且要付出很大代价。 – 反复申请、释放,使进程执行无限延迟,不仅延迟了 反复申请、释放,使进程执行无限延迟, 周转时间。还增加了系统开销,降低了系统吞吐量。 周转时间。还增加了系统开销,降低了系统吞吐量。
去掉“不剥夺条件” 去掉“不剥夺条件”