1 操 作 系 统 | 调 度 与 死 锁 1 CUIT 徐虹 第四章调度与死锁 ?不同的OS,处理机管理的策略不同 ?衡量调度策略的指标 ?周转时间 ?吞吐率 ?响应时间 ?设备利用率 ?调度算法 ?死锁的概念和解决方案 操 作 系 统 | 调 度 与 死 锁 2 CUIT 徐虹 4.1调度的类型和模型 ?调度类型 ?高级调度 ?作业的状态及其转换 作业从输入到完成要经历提交,收容, 执行,完成四个阶段。 ?作业调度(宏观调度或高级调度) 2 操 作 系 统 | 调 度 与 死 锁 3 CUIT 徐虹 ?进程调度(微观调度或低级调度) ?进程调度程序 ?记录进程中所有进程的执行情况:状 态,优先级,所用资源情况等。 ?选择占用处理机的进程。 ?进行进程上,下文切换,分配处理机 给进程。 操 作 系 统 | 调 度 与 死 锁 4 CUIT 徐虹 ?进程调度的时机 ?正在执行的进程执行完毕。 ?运行中的进程提出I/O 请求。 ?执行某原语操作。 ?在可剥夺调度方式中,一个具有 更高优先数的进程进入就绪队列。 ?在分时系统中,分配给该进程的 时间片已用完 3 操 作 系 统 | 调 度 与 死 锁 5 CUIT 徐虹 ?进程调度方式 ?非剥夺方式 ?剥夺方式 ?选择性剥夺调度 为每个进程设置特征位Up 和Vp Up=1:本进程可剥夺其它进程 Up=0:本进程不能剥夺其它进程 Vp=1:可被剥夺 Vp=0:不能被剥夺 操 作 系 统 | 调 度 与 死 锁 6 CUIT 徐虹 ?交换调度(中级调度) 按照给定的原则和策略,将处于外存交 换区中的就绪状态或等待状态的进程调入 内存,或把处于内存就绪状态或内存等待 状态的进程交换到外存交换区中。 4 操 作 系 统 | 调 度 与 死 锁 7 CUIT 徐虹 调度和进程状态转换 操 作 系 统 | 调 度 与 死 锁 8 CUIT 徐虹 调度的层次 5 操 作 系 统 | 调 度 与 死 锁 9 CUIT 徐虹 ?调度队列模型 ?进程调度队列模型 ?作业和进程调度队列模型 ?三级调度队列模型 操 作 系 统 | 调 度 与 死 锁 10 CUIT 徐虹 6 操 作 系 统 | 调 度 与 死 锁 11 CUIT 徐虹 ?调度准则和算法评价 ?调度准则 ?面向用户 ?周转时间 ?响应时间 ?最后期限 ?可预测性 ?面向系统 ?吞吐量 ?处理机利用率 ?公平 ?平衡资源 ?强制优先级 操 作 系 统 | 调 度 与 死 锁 12 CUIT 徐虹 ?设计调度算法时考虑的因素 ?应与系统的整个设计目标一致。 ?系统资源的均衡使用。 ?平衡系统和用户要求。 大多数系统都根据用户的需要而采用兼 顾某些目标的简单调度算法。 7 操 作 系 统 | 调 度 与 死 锁 13 CUIT 徐虹 ?调度性能的衡量 批处理系统:平均周转时间或平均带权周 转时间 分时或实时系统:平均响应时间 ?周转时间: 作业i. Ti = Tei – Tbi = Twi + Tsi Tei: 完成时间Tbi:提交时间 Twi:等待时间Tsi:执行时间 有n个作业的作业流,其平均周转时间: T = 1/n [T1 + T2 + ……+Tn] 操 作 系 统 | 调 度 与 死 锁 14 CUIT 徐虹 ?带权周转时间 比较某种调度算法对不同作业流的调度性能。 Wi=Ti/Tsi 平均带权周转时间: W = 1/n [W1 + w2 + …… +Wn] 一般,总是T或W小的作业被选中,因为这样 资源利用率较高,用户也满意。 ?响应时间 ?截止完成时间 8 操 作 系 统 | 调 度 与 死 锁 15 CUIT 徐虹 例:假定有四个作业,它们的提交,运行,完成情况如下: 作业Tbi Tsi 开始完成Ti Wi 1 8:00 2. 00 8:00 10:00 2. 00 1. 00 2 8:30 0. 50 10:00 10:30 2. 00 4. 00 3 9:00 0. 10 10:30 10:36 1. 6 16. 00 4 9:30 0. 20 10:36 10:48 1. 3 6. 5 平均周转时间T=1.725(小时) 平均带权周转时间W=6.875 操 作 系 统 | 调 度 与 死 锁 16 CUIT 徐虹 4.2调度算法 ?先来先服务调度算法 ?原理 ?作业 ?进程 ?特点 利于长作业,利于CPU 繁忙型的作业。 9 操 作 系 统 | 调 度 与 死 锁 17 CUIT 徐虹 0 5 10 15 20 1 2 3 4 5 操 作 系 统 | 调 度 与 死 锁 18 CUIT 徐虹 ?最短作业(进程)优先法(SJF) ?原理:估计运行时间。 ?优点:SJF能有效地降低作业的平均等待 时间和提高系统吞吐量。 ?缺点: ?对长作业不利; ?不能保证紧迫性作业或进程会得到及时处理; ?不一定能真正做到短作业优先。 10 操 作 系 统 | 调 度 与 死 锁 19 CUIT 徐虹 0 5 10 15 20 1 2 3 4 5 操 作 系 统 | 调 度 与 死 锁 20 CUIT 徐虹 0 5 10 15 20 1 2 3 4 5 最 短 剩 余 时 间 ( S R T) 11 操 作 系 统 | 调 度 与 死 锁 21 CUIT 徐虹 ?最高响应比优先法(HRN) HRN是对FCFS和SJF方式的一种综合平衡。 响应比:R=(W+T)/T = 1+W/T T:估计执行时间 W:等待时间 W+T:响应时间 每当要进行调度时,系统计算每个作业的 响应比,选择其中R最大者投入执行。 操 作 系 统 | 调 度 与 死 锁 22 CUIT 徐虹 1 2 3 4 5 0 5 10 15 20 12 操 作 系 统 | 调 度 与 死 锁 23 CUIT 徐虹 ?时间片轮转法 ?原理 将CPU 的处理时间分成固定大小的 时间片,系统将所有就绪进程按先来先 服务的原则排成队列。每次调度时,把 CPU 分配给队首进程,令其执行一个时 间片,时间片用完后,若进程未结束, 则重新排入就绪队列尾部。 ?时间片的划分 时间片Q=R / Nmax R:响应时间Nmax:最大进程数 操 作 系 统 | 调 度 与 死 锁 24 CUIT 徐虹 13 操 作 系 统 | 调 度 与 死 锁 25 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 26 CUIT 徐虹 0 5 10 15 20 1 2 3 4 5 14 操 作 系 统 | 调 度 与 死 锁 27 CUIT 徐虹 0 5 10 15 20 1 2 3 4 5 操 作 系 统 | 调 度 与 死 锁 28 CUIT 徐虹 虚时间片轮转法 15 操 作 系 统 | 调 度 与 死 锁 29 CUIT 徐虹 ?优先级法 ?静态优先级 ?作业的优先级确定原则: ?作业的紧急程度 ?作业类型 ?作业要求资源情况 操 作 系 统 | 调 度 与 死 锁 30 CUIT 徐虹 ?进程的优先级确定原则: ?按进程的类型赋予不同的优先级 ?用户进程类型:I/O 忙,CPU忙,I/O与 CPU 均衡 ?系统进程类型:调度进程,I/O 进程,中 断处理,存储各类等。 ?将作业的静态优先级作为它所属进程 的优先级。 ?特点:简单易行,系统开销小;不够 精确,可能出现优先级低的作业或进程, 长期得不到调度。 16 操 作 系 统 | 调 度 与 死 锁 31 CUIT 徐虹 ?动态优先级 把作业或进程的静态特性和动态特性 结合起来确定作业或进程的优先级,在 执行过程中,优先级不断变化。 ?确定进程动态优先级的原则: ?根据其占有CPU 时间的长短; ?根据就绪进程等待CPU 的时间长短 操 作 系 统 | 调 度 与 死 锁 32 CUIT 徐虹 ?改变进程优先级的方式: ?线形优先级调度策略 新创建的进程按FCFS方式排成就绪队列,优先级以 a 的速率增加,正在执行的进程优先级以b 的速率改变。 P(t)=a*(t1’- t1)+b*(t – t1’) ?非线形改变优先级规则 t1’ t a b t1 17 操 作 系 统 | 调 度 与 死 锁 33 CUIT 徐虹 ?多队列调度法 ?原理 多队列调度是根据作业的性质或类型 不同,将就绪进程队列再分为若干子队列, 各作业固定地分属于一队列,每个队列采 用一种算法。 操 作 系 统 | 调 度 与 死 锁 34 CUIT 徐虹 18 操 作 系 统 | 调 度 与 死 锁 35 CUIT 徐虹 ?实现方式 ?规定队列的优先级,优先级高的先获调 度。 例:按规定时间片运行前台作业,运行 完成或阻塞时,才转去调度后台作业。 ?为各队列分配一定的占用CPU时间比例。 例:前台:80%后台:20% 或:前台运行N个时间片,后台运行一个时间 片。 操 作 系 统 | 调 度 与 死 锁 36 CUIT 徐虹 ?多级反馈轮转法 ?设置多个就绪队列,每个队列赋予不同地 优先级。队列按FCFS原则排列。 ?各队列时间片不同。 ?当一个新进程进入内存后,首先放在第 一队列尾,按FCFS原则调度;如果该时 间片内未结束,转入第二队列尾;直到 最后的第N队列,在第N队列中便采取按 时间片轮转的方式执行。 ?仅当第i队列空闲时,才调度第i+1队列。 如有新进程进入优先级较高的队列,则 剥夺CPU执行新进程,旧进程放入原队 列尾 19 操 作 系 统 | 调 度 与 死 锁 37 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 38 CUIT 徐虹 ?q=1 和q=2 i 20 操 作 系 统 | 调 度 与 死 锁 39 CUIT 徐虹 ?算法性能 ?终端型用户:在第一队列中完成,作 业短,交互型。 ?短批处理用户:周转时间较短,通常 三个队列即可完成。 ?长批处理作业用户:依次在前N-1个 队列中执行,在第N个队列中按轮转 方式运行。 操 作 系 统 | 调 度 与 死 锁 40 CUIT 徐虹 ?公平共享调度 ?用户的应用程序由一组进程(线程)构 成; ?用户关心的是应用程序的执行; ?需要基于进程组的调度方法。 21 操 作 系 统 | 调 度 与 死 锁 41 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 42 CUIT 徐虹 ?各种调度算法性能比较 22 操 作 系 统 | 调 度 与 死 锁 43 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 44 CUIT 徐虹 4.3 实时系统中的调度 ?对实时系统的要求 ?调度信息 ?就绪时间 ?开始截止时间和完成截止时间 ?处理时间 ?资源要求 ?优先级 23 操 作 系 统 | 调 度 与 死 锁 45 CUIT 徐虹 ?调度方式 ?抢占调度方式 ?非剥夺调度方式 ?具有快速响应外部中断的能力 ?快速任务分派 操 作 系 统 | 调 度 与 死 锁 46 CUIT 徐虹 ?实时调度算法 ?时间片轮转调度算法 24 操 作 系 统 | 调 度 与 死 锁 47 CUIT 徐虹 ?非抢占优先权调度算法 操 作 系 统 | 调 度 与 死 锁 48 CUIT 徐虹 ?基于时钟中断抢占的优先权调度算法 25 操 作 系 统 | 调 度 与 死 锁 49 CUIT 徐虹 ?立即抢占的优先权调度 操 作 系 统 | 调 度 与 死 锁 50 CUIT 徐虹 ?实时调度实例 ?具有开始截止时间的非周期实时任 务的调度 26 操 作 系 统 | 调 度 与 死 锁 51 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 52 CUIT 徐虹 ?具有完成截止时间的周期性实时 任务的调度 27 操 作 系 统 | 调 度 与 死 锁 53 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 54 CUIT 徐虹 4.4多处理机调度 ?多处理机系统(multiprocessor system) ?广义多处理机系统 ?狭义多CPU 系统 ?多处理机的OS系统 ?进程可在CPU间进行透明迁移。 ?并行地执行用户的几个程序(进程)。 ?提供系统结构重组能力,支持系统的降 级使用。 28 操 作 系 统 | 调 度 与 死 锁 55 CUIT 徐虹 ?多处理机系统的调度策略 ?进程调度 ?同构型多处理机系统 ?静态分配(Static Assignment) ?动态分配(Dynamic Assignment) ?自调度(Self-Scheduling) ?异构型多处理机系统 操 作 系 统 | 调 度 与 死 锁 56 CUIT 徐虹 ?自调度 系统中有一个公共的线程或进程的就 绪队列,当某个处理机空闲时,从队列 中摘取一个进程或线程运行。 ?自调度算法 ?FCFS ?最小优先数优先算法 ?抢占式最小优先数优先算法 ?自调度算法的缺陷 ?改进:设置局部就绪队列。 29 操 作 系 统 | 调 度 与 死 锁 57 CUIT 徐虹 ?成组调度(Group Scheduling)或 协同调度 将同一进程的一组线程调度到几个 CPU 上同时执行。减少进程(线程)的 切换,使系统性能改善;减少调度频率, 从而减少了调度开销。 ?面向所有的应用程序平均分配处理机时间 ?面向所有的线程平均分配处理机时间 操 作 系 统 | 调 度 与 死 锁 58 CUIT 徐虹 30 操 作 系 统 | 调 度 与 死 锁 59 CUIT 徐虹 ?专用处理机分配 ?在应用程序执行期间,专为该程序的 每个线程分配一个处理机。 ?整机效率较高;完全避免进程或线程 间的切换。 操 作 系 统 | 调 度 与 死 锁 60 CUIT 徐虹 4.5死锁 ?死锁的概念 31 操 作 系 统 | 调 度 与 死 锁 61 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 62 CUIT 徐虹 ?定义 当某进程提出资源申请后,使得系统 中一些进程处于无休止的阻塞状态,在无 外力作用下,永远不能再继续前进。 进程——资源图 32 操 作 系 统 | 调 度 与 死 锁 63 CUIT 徐虹 ?死锁的起因 例:有两个进程P、Q,系统仅有一台磁带机和打印机。 Pr1:P进程申请打印机A Qr1:Q进程申请磁带机B Pr2:P进程申请磁带机B Qr2:Q进程申请打印机A Pr3:P进程释放打印机A Qr3:Q进程释放磁带机B Pr4:P进程释放磁带机B Qr4:Q进程释放打印机A 操 作 系 统 | 调 度 与 死 锁 64 CUIT 徐虹 33 操 作 系 统 | 调 度 与 死 锁 65 CUIT 徐虹 操 作 系 统 | 调 度 与 死 锁 66 CUIT 徐虹 P1 . . . Request 80K bytes; Request 60K bytes; P2 Request 70K bytes; Request 80K bytes; . . . . . . . . . 可供分配的空间为200K 当两个进程都执行第二个请求时发生死锁 34 操 作 系 统 | 调 度 与 死 锁 67 CUIT 徐虹 ?产生死锁的原因: ?系统资源不足:为多道程序所共享 的资源不足; ?进程推进顺序非法。 操 作 系 统 | 调 度 与 死 锁 68 CUIT 徐虹 ?产生死锁的必要条件 ?互斥条件:某段时间内某资源只能由 一个进程使用。 ?请求和保持:进程因请求资源而阻塞 时,对已分配给它的资源保持不放。 ?不剥夺条件:资源在未使用完前,不 能被剥夺,由使用进程释放。 ?环路条件:发生死锁时,有向图必构 成一环路。 35 操 作 系 统 | 调 度 与 死 锁 69 CUIT 徐虹 ?处理死锁的方法 ?预防死锁 预防策略:破坏死锁产生的四个必要条 件,向进程施加适当的限制,使死锁在结 构上不可能发生。 ?避免死锁 避免策略:精心地分配资源,动态地回 避死锁。 ?检测死锁与恢复 检测与恢复:一旦发生死锁,系统不但能 及时检测出,还能采取积极措施加以解决。 操 作 系 统 | 调 度 与 死 锁 70 CUIT 徐虹 4.6死锁的预防和避免 ?死锁的预防 ?资源静态分配法 ?采用剥夺控制 ?破坏互斥性 ?资源顺序分配法 对系统的全部资源编号,并规定进程 申请资源时只能按升序进行。 36 操 作 系 统 | 调 度 与 死 锁 71 CUIT 徐虹 ?系统的安全状态 ?安全状态 系统能按某种顺序为每个进程分配其 所需的资源,使每个进程执行完毕。 安全序列:进程安全执行完的顺序。 操 作 系 统 | 调 度 与 死 锁 72 CUIT 徐虹 ?由安全状态向不安全状态的转换 例:系统中有10台磁带机,由A、B、C三进程共享, 运行一段时间后,情况如下: 进程名已分配数尚需申请数最大需求数 A2 2 4 B3 3 6 C 3 5 8 此时已分配8台,安全序列:A,B,C 如B申请一台,则不满足;如A申请一台就满足, 进行分配。 37 操 作 系 统 | 调 度 与 死 锁 73 CUIT 徐虹 例. 多项资源的安全序列 操 作 系 统 | 调 度 与 死 锁 74 CUIT 徐虹 38 操 作 系 统 | 调 度 与 死 锁 75 CUIT 徐虹 进入不安全状态 操 作 系 统 | 调 度 与 死 锁 76 CUIT 徐虹 ?银行家算法(Banker’s Algorithm) ?算法描述: public class state { int [] resource = new int[m]; int [] available = new int[m]; int [][] claim = new int[n][m]; int [][] alloc = new int[n][m]; } (a) global data structures 39 操 作 系 统 | 调 度 与 死 锁 77 CUIT 徐虹 if (alloc [i,*] + request [*] > claim [i,*]) { < error >; // --total request > claim } else if (request [*] > available [*]) { < suspend process >; } else { // --simulate alloc < define newstate by: alloc [i,*] = alloc [i,*] + request [*]; available [*] = available [*] - request [*] >; } 操 作 系 统 | 调 度 与 死 锁 78 CUIT 徐虹 if (safe (newstate)) { < carry out alloc >; } else { < restore original state >; < suspend process >; } (b) resource alloc algorithm 40 操 作 系 统 | 调 度 与 死 锁 79 CUIT 徐虹 public boolean safe (state S) { int [] currentavail = new int [m]; process [] rest = new process[<number of processes>]; currentavail = available; rest = {all processes}; possible = true; 操 作 系 统 | 调 度 与 死 锁 80 CUIT 徐虹 while (possible) { find a Pk in rest such that claim [k,*] - alloc [k,*] <= currentavail; if (found) { // simulate execution of P currentavail = currentavail + alloc [k,*]; rest = rest - {Pk}; } else possible = false; } return (rest == null); } (c) test for safety algorithm (banker's algorithm) 41 操 作 系 统 | 调 度 与 死 锁 81 CUIT 徐虹 ?优点: 资源利用率比静态资源分配法高, 又避免死锁。 ?缺点: 对资源分配过于保守;计算太多, 并且需知道对资源的最大需求量,不太 实际。 操 作 系 统 | 调 度 与 死 锁 82 CUIT 徐虹 4.7死锁的检测和解除 ?死锁的检测 ?进程资源图 在图中找一既非阻塞又非孤立的进 程节点Pi,如对某资源的请求能满足, 把请求边改为分配边,当Pi只有分配边 时,消去所有分配边,并释放占有的资 源。再选下一进程节点Pj,…,若能消 去所有边,那么该图是可完全简化的。 否则称为不可简化。 42 操 作 系 统 | 调 度 与 死 锁 83 CUIT 徐虹 ?死锁定理 ?引理:一个给定的进程——资源图的 全部化简序列导致同一不可简化图。 ?死锁定理:S是死锁状态,当且仅当 S的资源——进程图不是可完全化简 图。 ?死锁检测算法 操 作 系 统 | 调 度 与 死 锁 84 CUIT 徐虹 43 操 作 系 统 | 调 度 与 死 锁 85 CUIT 徐虹 ?死锁的恢复 ?删除法 ?删除策略:为解除死锁状态所需删除的进 程数最少,以及删除那些代价最小的进程。 ?衡量进程删除代价的依据:作业或进程的 优先级、作业类的预定代价、运行代价。 ?剥夺法 从一些进程那里剥夺出足够数量的资源,分 给死锁进程,使其解除死锁。被剥夺资源的进程 以请求资源的方式保留它们,以便于以后恢复运 行。 操 作 系 统 | 调 度 与 死 锁 86 CUIT 徐虹 ?本章重点 ?三级调度; ?调度算法; ?实时调度和多处理机调度; ?死锁的概念; ?银行家算法; ?死锁的检测和恢复。