处理机调度和死锁

来源:互联网 发布:欧美爱情动作片 知乎 编辑:程序博客网 时间:2024/05/18 02:13
  • 作业:用户再一次计算过程或事务处理过程中,从输入开始到输出结束要求计算机系统所做的工作集合

处理机调度的层次和调度算法的目标

处理机调度的层次

  • 高级调度
    • 高级调度又称为长程调度或作业调度,它的调度对象是作业
    • 运行频率最低
    • 根据某种算法,决定外存上处于后备队列中的哪几个作业调入内存
  • 低级调度
    • 低级调度又称为进程调度或短程调度,其所调度的对象是进程(或内核级线程)
    • 运行频率最高
    • 根据某种算法,决定就绪队列中的哪个进程应获得处理机
  • 中级调度
    • 又称为内存调度。
    • 提高内存利用率和系统吞吐量。
    • 将暂时不能运行的进程调至外存等待或将已具备运行条件的就绪进程调至内存。

处理机调度算法的目标

  • 处理机调度算法的共同目标
    • 资源利用率,CPU利用率=CPU有效工作时间 / (CPU有效工作时间 + CPU空闲等待时间)
    • 公平性
    • 平衡性
    • 策略强制执行
  • 批处理系统的目标
    • 平均周转时间短。周转时间是指从作业被提交给系统开始,到作业完成为止的这段时间间隔
    • 系统吞吐量高。吞吐量是指再单为时间内系统所完成的作业数
    • 处理机利用率高
  • 分时系统的目标
    • 响应时间快
    • 均衡性
  • 实时系统的目标
    • 截止时间的保证
    • 可预测性

作业与作业调度

  • 作业和作业步
    • 作业:在批处理系统中,是以作业为单位从外存调入内存的
    • 作业步:在作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步骤才能得到结果。其中每一个加工步骤称为一个作业步。一个典型的作业可分为:“编译”作业步、“链接装配”作业步和“运行”作业步
  • 作业控制块
    • 为了管理和调度作业,在多道批处理系统中,为每个作业设置了一个作业控制块JCB,它是作业在系统中存在的标志。通常在JCB中包含的内容由:作业标识、用户名称、用户帐号、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、要求内存大小等)、资源使用情况等
  • 作业运行的三个阶段和三种状态
    • 收容阶段:作业建立了JCB并处于作业后备队列中,对应“后备状态”
    • 运行阶段:一个作业从第一次进入就绪状态开始,直到运行结束前,都处于“运行状态”
    • 完成阶段:当作业运行完成、或发生异常情况而提前结束时,作业进入完成阶段,对应“完成状态”

作业调度的主要任务

  • 把作业调度称为接纳调度,在每次执行作业调度时,都需要作出以下两个决定:
  • 接纳多少个作业
    • 取决于多道程序度,即允许多少个作业同时在内存中运行
  • 接纳哪些作业
    • 取决于所采用的调度算法,如:先来先服务调度算法、短作业优先调度算法、基于作业优先级的调度算法

先来先服务(FCFS)调度算法

  • 即可用于作业调度,也可以用于进程调度
  • 系统按照作业到达的先后次序来进行调度

短作业优先(SJF)的调度算法

  • 以作业的长短来计算优先级,作业越短优先级越高
  • 短作业优先的缺点:
    • 必须预知作业的运行时间
    • 对长作业非常不利
    • 在采用SJF算法时,人—机无法交互
    • 不能保证紧迫性作业能得到及时处理

优先级调度算法(priority-scheduling algorithm, PSA)

* 系统从后备队列中选择若干个优先级最高的作业装入内存* 这里的优先级指作业的紧迫程度

高响应比优先调度算法(Highest Response Ratio Next, HRRN)

* 响应比 = 优先权 = (等待时间+要求服务时间)/要求服务时间* 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而类似与SJF算法,有利于短作业;当要求服务的时间相同时,作业的优先权又决定于其等待时间,因而该算法又类似于FCFS;对于长作业的优先级,可以随等待时间的增加而提高,当其等待时间足够长时,也可获得处理机

进程调度

进程调度的任务、机制和方式

  • 进程调度的任务
    • 保存处理机的现场信息
    • 按某种算法选取进程
    • 把处理器分配给进程
  • 进程调度机制
    • 排队器:为了提高进程调度的效率,事先将系统中的所有就绪进程按照一定的策略排成一个或多个队列,以便调度程序能最快地找到它。以后每当有一个进程转变为就绪状态时,排队器将它插入到相应的就绪队列
    • 分派器:分派器依据进程调度程序所选定的进程,将其从就绪队列中取出,然后进行从分派器到新选出进程间的上下文切换,将处理机分配给新选出的进程
    • 上下文切换器:在对处理机进行切换时,会发生两对上下文切换操作:
      • 第一对上下文切换时,OS将保存当前进程的上下文,即把当前进程的处理机寄存器内容保存到该进程的进程控制块内的相应单元,再装入分派程序的上下文,以便分派程序运行
      • 第二对上下文切换是移出分派程序的上下文,而把新选进程的CPU现场信息装入到处理机的各个相应寄存器中,以便新选进程运行
  • 进程调度方式
    • 非抢占方式:一旦将处理机分配给某个进程后,一直让它执行,决不会抢占当前正在运行进程的处理机,直到进程运行完毕或因发生某事件而使其无法继续运行
      • 可能引起进程调度的因素可归结为:
        • 正在执行的进程运行完毕或因发生某事件而使其无法再继续运行
        • 正在执行中的进程因提出I/O请求而暂停执行
        • 在进程通信或同步过程中,执行了某种原语操作,如block原语
      • 优点是实现简单,系统开销小,适用于大多数的批处理系统。
      • 不能用于分时系统和大多数实时系统
    • 抢占方式:允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程
      • 可以防止某个长进程长时间占用处理机
      • 抢占需要遵循的原则:
        • 优先权原则
        • 短进程优先原则
        • 时间片原则

轮转调度算法(RR)

  • 基于时间片的轮转调度算法
  • 轮转法的基本原则
    • 根据FCFS策略,将所有的就绪进程排成一个就绪队列,并设置一定的时间间隔,每隔一定的时间便激活系统中的进程调度程序,完成一次调度,将CPU分配给对首进程
  • 进程切换时机
    • 何时进行进程的切换,可分为两种情况:
      • 若一个时间片尚未用完,正在运行的进程便已完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片
      • 再一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾
  • 时间片大小的确定
    • 时间片过小则会频繁执行进程调度和进程上下文切换,会增加系统的开销
    • 时间片过大则RR算法退化为FCFS算法

优先级调度算法

  • 优先级调度算法的类型
    • 非抢占式优先级调度算法
    • 抢占式优先级调度算法。在进程执行期间,若出现了另一个优先级更高的进程,调度程序便将处理机分配给新到的优先级更高的进程
  • 优先级的类型
    • 静态优先级:进程的优先级在运行期间是保持不变的
      • 确定优先级大小的依据有如下三个:
        • 进程类型
        • 进程对资源的需求
        • 用户需求
      • 静态优先级简单易行,系统开销小,但不够精确,有可能出现优先级低的进程长期没有被调度的情况
    • 动态优先级:进程的优先级随进程的推进或等待时间的增加而改变,以便获得更好的调度性能

多队列调度算法

  • 将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级

多级反馈队列调度算法

  • 调度机制:
    • 1.设置多个就绪队列,并为每个队列赋予不同的优先级;
    • 2.当轮到某进程执行时,如能在该时间片内完成,便可撤离系统,否则放入下一队列的末尾等待调度。若在第二个时间片内仍未完成,则再放入下一队列的末尾,依次类推;
    • 3.按队列优先级调度,调度程序首先调度最高优先级队列中的诸进程运行。
  • 调度算法的性能
    • 如果规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便能较好的满足各种类型用户的需要

基于公平原则的调度算法

  • 保证调度算法
    • 保证每个进程都获得相同的处理机时间
    • 再实施公平调度算法时系统中必须具有这样一些功能:
      • 跟踪计算每个进程自创建以来已经执行的处理时间
      • 计算每个进程应获得的处理机时间,即自创建以来的时间除以n
      • 计算进程获得处理机时间的比率,即进程实际执行的处理时间和应获得的处理机时间之比
      • 比较各进程获得处理机时间的比率
      • 调度程序应选择比率最小的进程将处理机分配给它,并让该进程一直运行,直到超过最接近它的进程比率为止
  • 公平分享调度算法
  • 分配给每个进程相同的处理机时间

实时调度

  • 实时调度必须能满足实时任务对截止时间的要求

实现实时调度的基本条件

  • 提供必要的信息
    • 为了实现实时调度,系统应向调度程序提供有关任务的信息:
    • 就绪时间,指某任务称为就绪状态的起始时间,在周期任务的情况下,它是事先预知的一串时间序列
    • 开始截至时间和完成截止时间。
    • 处理时间,一个任务从开始执行到完成时所需的时间
    • 资源要求,任务执行时所需的一组资源
    • 优先级,如果某任务的开始截止时间错过,势必引起故障,则应为该任务赋予“绝对”优先级;如果其开始截至时间的错过,对任务的继续运行无重大影响,则可为其赋予“相对”优先级,供调度程序参考
  • 系统处理能力强
    • 提高系统处理能力的途径:
      • 一是采用单处理机系统,单须增强其处理能力,以显著地减少对每一个任务地处理时间
      • 二是采用多处理机系统
  • 采用抢占式调度机制
    • 在含有HRT(硬实时系统)任务地实时系统中广泛采用抢占机制
  • 具有快速切换机制
    • 对中断地快速响应能力
    • 快速的任务分派能力

实时调度算法地分类

  • 根据实时任务性质,可将实时调度地算法分为硬实时调度算法和软实时调度算法
  • 按调度方式,则可分为非抢占调度算法和抢占调度算法
  • 非抢占式调度算法
    • 非抢占式轮转调度算法
    • 非抢占式优先调度算法
  • 抢占式调度算法
    • 基于时钟中断地抢占式优先级调度算法
    • 立即抢占地优先级调度算法

最早截至时间优先EDF(Earliest Deadline First)算法

  • 非抢占式调度方式用于非周期实时任务
  • 抢占调度方式用于周期实时任务

最低松弛度优先LLF(Least Laxity First)算法

  • 根据任务地紧急(或松弛)程度确定任务地优先级
  • 在实现该算法时要求系统中有一个按松弛度排序地实时任务就绪队列,松弛度最低地任务排在最前面,调度程序选择队列中的队首任务执行
  • 松弛度=任务结束截止时间 - 任务执行所需时间

优先级倒置

  • 优先级倒置的形成
    • 高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。如两个进程共享一个变量时,低优先级的进程在执行时,高优先级进程进入,但变量已被低优先级进程占用。
    • 优先级倒置地两种解决方法:
      • 1.(此方法比较简单)当前进程(线程)进入临界区后,所占用地处理机就不允许被抢占
      • 2.(此方法比较实用)建立在动态优先级继承基础之上
        • 若此时低优先级进程P1正在使用临界资源,有高优先级进程P3要进入临界区使用临界资源,此时P3被阻塞,P1继承P3的优先级,并且一直保持到P1退出临界区。这样做地目的在于不让优先级比P1高,比P3低的进程插进来

死锁概述

资源问题

  • 在系统中有许多不同类型地资源,其中可以引起死锁地主要是,需要采用互斥访问方法的、不可以被抢占地资源,即在前面介绍的临界资源。
  • 可重用性资源和消耗性资源
    • 可重用性资源
      • 可重用性资源是一种可供用户重复使用多次的资源,有如下性质:
        • 每一个可重用性资源中地单元只能分配给一个进程使用,不允许多个进程共享
        • 进程在使用可重用性资源时,须按照这样地顺序:
          • 1.请求资源,如果请求资源失败,请求进程将会被阻塞或循环等待
          • 2.使用资源,进程对资源进行操作
          • 3.释放资源
      • 系统中每一类可重用性资源中地单元数目时相对固定的,进程在运行期间既不能创建也不能删除它
    • 可消耗性资源
      • 可消耗性资源又称为临时资源,它是在进程运行期间,由进程动态地创建和消耗地,具有如下性质:
        • 1.每一类可消耗性资源地单元数目在进程运行期间时可以不断变化的
        • 2.进程在运行过程中,可以不断地创造可消耗性资源地单元,将它们放入该资源类地缓冲区中,以增加该资源类地单元数目
        • 3.进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己地消耗,不再将它们返回给该资源类中。可消耗性资源通常时由生产者进程创建,由消费者进程消耗。
  • 可抢占性资源和不可抢占性资源
    • 可抢占性资源:指某进程获得这类资源后可以被其他进程或系统抢占。如高优先级进程抢占低优先级所占用地处理机
    • 不可抢占资源:进程一旦获得此类资源后不可被强行收回,只能在进程用完后自行释放

计算机系统中的死锁

  • 竞争不可抢占性资源引起死锁
    • 通常系统中所拥有地不可抢占性资源其数量不足以满足多个进程运行地需要,使得进程在运行过程中会因为争夺资源而陷入僵局
  • 竞争可消耗资源引起死锁
  • 进程推进顺序不当引起死锁

死锁地定义、必要条件和处理方法

  • 死锁地定义
    • 如果一组进程中地每一个进程都在等待仅有该组进程中地其他进程才能引发的事件,那么该组进程时死锁地(Deadlock)
  • 产生死锁的必要条件
    • 产生死锁必须同时具备以下四个必要条件,只要其中任意一个条件不成立,死锁就不会发生。
    • 1.互斥条件。进程对所分配到的资源进行排他性使用
    • 2.请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,但对自己已获得的资源保持不放
    • 3.不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放
    • 4.循环等待条件。在发生死锁时,必然存在一个进程—资源循环链
  • 处理死锁的方法
    • 1.预防死锁。通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。
    • 2.避免死锁。同样属于事先预防策略,在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免发生死锁
    • 3.检测死锁。通过检测机构及时地检测出死锁地发生,然后采取时当地措施,把进程从死锁中解脱出来
    • 4.解除死锁。当检测到系统中已发生死锁时,就采取相应地措施,将进程从死锁状态中解脱出来。常用地方法是撤销一些进程,回收资源,将它们分配给已处于阻塞状态地进程,使其能继续运行
    • 以上四种方法从1到4对死锁地防范程度逐渐减弱,但对应地是资源利用率地提高,以及进程因资源因素而阻塞地频度下降(即并发程度提高)

预防死锁

  • 预防死锁的方法是通过破坏产生死锁的四个必要条件中的一个或几个,以避免死锁。由于互斥条件是非共享设备所必须的,所以主要是破坏产生死锁的后三个条件

破坏“请求和保持”条件

  • 为了破坏“请求和保持”条件,系统必须保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。该保证可通过如下两个不同的协议实现:
    • 第一种协议:
      • 该协议规定,所有进程在开始运行之前,必须一次性地申请在整个运行过程中所需地全部资源(要么全部分配,要么全都不分配)
    • 第二种协议:
    • 该协议是对第一种协议地改进,它允许一个进程只获得运行初期所需地资源后,便开始运行。进程运行过程中再逐步释放已分配给自己地,且已用毕的全部资源,然后再请求新的所需资源。

破坏“不可抢占”条件

  • 协议规定,当一个已经保持了某些不可被抢占资源地进程,提出新的资源请求而不能得到满足时,它必须释放已经保持地所有资源,待需要时再重新申请。
  • 该方法实现起来比较复杂,且需要付出很大的代价。因为一个不可抢占的资源再使用一段时间后被抢占可能导致前一阶段工作地失效。还可能会因为反复地申请和释放资源致使进程地执行被无限地推迟,这不仅延长了进程地周转时间,而且也增加了系统开销,降低了系统吞吐量。

破坏“循环等待”条件

  • 一个可保证“循环等待”条件不成立的方法是,对系统所有资源类型进行线性排序,并赋予不同的序号。
  • 在对系统所有资源类型进行线性排序后,便可采用这样地预防协议:规定每个进程必须按序号递增地顺序请求资源。
  • 加入某进程已请求到一些序号较高地资源,后来它又想请求一个序号低的资源时,它必须先释放所有具有相同和更高序号地资源后,才能申请序号低的资源。在这种策略所形成地资源分配图中,不可能出现环路,因而破坏了“循环等待”条件。
  • 存在的问题:
    • 1.为系统中各类资源所规定的序号必须相对稳定,这就限制了新类型设备地增加
    • 2.作业使用各类资源的顺序与系统规定的顺序不同,造成资源的浪费
    • 3.按规定次序申请资源的方法必然会限制用户简单、自主地编程

避免死锁

*避免死锁同样是属于事先预防地策略,但并不是事先采取某种限制措施,破坏死锁地必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁

系统安全状态

*当系统处于安全状态,可避免死锁;当系统处于不安全状态,则可能进入死锁状态
* 安全状态
* 系统在进行资源分配之前,应先计算此次资源分配地安全性。若此次分配不会导致系统进入不安全状态,才可将资源分配给进程,否则,令进程等待
* 由安全状态向不安全状态地转换
* 如果不按照完全序列分配资源,则系统可能会由安全状态进入到不安全状态

利用银行家算法避免死锁

  • 每一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型地最大单元数目,其数目不应超过系统所拥有地资源总量。当进程请求一组资源时,系统必须首先确定是否有足够地资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。
0 0
原创粉丝点击