《操作系统》 2018/11/22

chapter 3 处理机调度与死锁

一、处理机调度的基本概念

作业进入系统驻留在外存的后备队列上再至调入内存运行完毕,经历下述三级调度。

    1. 高级调度(High Scheduling)
      又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling)
      主要在早期批处理阶段,处理在外存上的作业。
      在每次执行作业调度时,都须作出两个决定:
      i. 接纳多少作业——取决于多道程序度。应根据系统的规模和运行速度等情况综合考虑。
      ii. 接纳哪些作业——取决于采用的调度算法。如先来先服务,短作业优先等
    1. 低级调度(Low Level Scheduling)
      也称为进程调度、微观调度或短程调度(Short-Term Scheduling)
      决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。
      进程调度方式
      1)非抢占方式(Non-preemptive Mode)
      一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。
      2)抢占方式(Preemptive Mode)
      允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。
    1. 中级调度(Intermediate-Level Scheduling)
      又称交换调度或中程调度(Medium-Term Scheduling)
      引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。

    作业和进程的状态转换图在这里插入图片描述
    三级调度比较
    在这里插入图片描述

3.2 调度算法

    1. 先来先服务调度算法FCFS (First Come First Service)
      一种最简单的调度算法,按先后顺序进行调度。既可用于作业调度,也可用于进程调度。
      i. 按照作业提交,或进程变为就绪状态的先后次序分派CPU;
      ii. 新作业只有当当前作业或进程执行完或阻塞才获得CPU运行
      iii. 被唤醒的作业或进程不立即恢复执行,通常等到当前作业或进程出让CPU。
    1. 短作业(进程)优先调度算法SJF/SPF (Shortest Job First) OR (Shortest Process First)
      优点:
      通过上表可见采用SJF/SPF算法,平均周转时间、平均带权周转时间都有明显改善。SJF/SPF调度算法能有效的降低作业的平均等待时间,提高系统吞吐量。
      方式:
      分抢占和非抢占两种方式,上例为简单的非抢占式。

    SJF/SPF的不足:
    i. 对短作业有利,但同时造成了对长作业的不利。
    ii.由于作业(进程)的长短含主观因素,不一定能真正做到短作业优先。
    iii.未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)的及时处理。

    1. 高优先权优先调度算法HPFHighest Priority First
      照顾紧迫性作业,使其获得优先处理而引入调度算法。常用于批处理系统中的作业调度算法,以及多种操作系统中的进程调度算法
    1. 分两种方式:
      非抢占式优先权算法
      抢占式优先权算法 关键点:新作业产生时
      2)优先权的类型
      静态优先权:创建进程时确定,整个运行期间保持不变。一般利用某一范围的一个整数来表示,又称为优先数。
      动态优先权:创建进程时赋予的优先权可随进程的推进或随其等待时间的增加而改变。
      3)高响应比优先调度算法HRRNHighest Response Raito Next
      短作业优先算法是一种比较好的算法(相当于根据作业长度设定的静态优先权算法),适用于短作业较多的批处理系统中,其主要不足是长作业的运行得不到保证。
      HRRN为每个作业引入动态优先权,使作业的优先级随着等待时间的增加而以速率a提高:
      在这里插入图片描述
    1. 基于时间片的轮转调度算法RR (Round Robin)
      分时系统新需求:及时响应用户的请求;采用基于时间片的轮转式进程调度算法。
      早期分时系统采用的是简单的时间片轮转法,进入90年代后广泛采用多级反馈队列调度算法。

    1)时间片轮转算法
    将系统中所有的就绪进程按照FCFS原则,排成一个队列。
    每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。
    在一个时间片结束时,发生时钟中断。
    调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。

    2)多级反馈队列算法FB (Multiple-level Feed Back Queue)
    设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。
    赋予各队列进程执行时间片大小不同, 优先权越高,时间片越短。
    当一个新进程进入内存,引发的调度过程
    在这里插入图片描述
    几种常用调度算法的比较
    在这里插入图片描述

3.3 实时调度

    1. 实现实时调度的基本条件
      1)提供必要的信息
      为了实现实时调度,系统应向调度程序提供有关任务的下述信息:
      就绪时间。该任务成为就绪状态的时间。
      开始截止时间、完成截止时间。
      处理时间。从开始执行到完成所需时间。
      资源要求。任务执行时所需的一组资源。
      优先级。根据任务性质赋予不同优先级。
      2)系统处理能力足够强
      处理能力不足可能会出现某些实时任务不能得到及时处理,导致难以预料的后果。
      3)采用抢占式调度机制
      硬实时任务:广泛采用抢占机制。
      小的实时系统:如能预知任务的开始截止时间,为简化调度程序和对任务调度时所花费的系统开销,可采用非抢占调度机制,
      4)具有快速切换机制
      对外部中断的快速响应能力。
      快速的任务分派能力。
    1. 实时调度算法的分类

    1)非抢占调度算法
    该算法较简单,用于一些小型实时系统或要求不太严格的实时系统中,又可分为:
    i.非抢占式轮转调度算法。常用于工业生产的群控系统中,要求不太严格。
    ii.非抢占式优先调度算法。要求相对严格,根据任务的优先级安排等待位置。可用于有一定要求的实时控制系统中。(精心设置可获得百ms级的响应时间)
    2)抢占式调度算法
    较严格的实时系统中(t约为数十ms),选择采用抢占式优先权调度算法。根据抢占发生时间可分为:
    i.基于时钟:某高优先级任务到达后并不立即抢占,而等下一个时钟中断时抢占。
    ii.立即抢占:一旦出现外部中断,只要当前任务未处于临界区,就立即抢占处理机。

    1. 常用的几种实时调度算法
      1)最早截止时间优先EDF(Earliest Deadline First)
      根据任务的开始截止时间来确定任务的优先级。截止时间越早,其优先级越高。
      系统保持一个实时任务就绪队列
      队列按各任务截止时间的早晚排序
      调度程序总是选择就绪队列中的第一个任务,分配处理机使之投入运行。
      新任务产生时,是否等当前程序执行完:
      抢占式/非抢占式
      可能会使作业错过,但可适用于软实时系统
      2)最低松弛度优先LLF(Least Laxity First)
      根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高(松弛度值越小),优先级就越高。
      松弛度= 截止完成时间 – 还需执行时间 - 当前时间
      可理解为当前时刻到开始截止时刻间的差距,随着时间的推进,这个差值逐渐变小,任务越来越紧迫。

3.4 产生死锁的原因和必要条件

定义死锁
死锁(Deadlock):指多个进程在运行过程中,因争夺资源而造成的一种僵局。当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。
产生死锁的原因可归结为如下两点:
竞争资源。系统中供多个进程共享的资源如打印机、公用队列等的数目不满足需要时,会引起资源竞争而产生死锁。
进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,同样会导致死锁。
产生死锁的必要条件(四个条件都具备就会死锁,缺一就不会死锁)
互斥条件:进程对所分配到的资源进行排他性使用
请求和保持条件:进程已经保持了至少一个资源,又提出新的资源请求,而新请求资源被其他进程占有只能造成自身进程阻塞,但对自己已获得的其他资源保持不放,必然影响其他进程。
不剥夺条件:进程已获得的资源未使用完之前不能被剥夺,只能在使用完时由自己释放。
环路等待条件
处理死锁的基本方法
预防死锁。
避免死锁。
检测死锁。
解除死锁。

3.5 预防死锁的方法

    1. 预防死锁
      i.摒弃“请求和保持”条件:所有进程开始运行前,必须一次性的申请其在整个运行过程所需的全部资源(AND)。算法简单、易于实现且很安全。但缺点是资源浪费严重、或进程延迟运行。
      ii.摒弃“不剥夺”条件:允许进程先运行,但当提出的新要求不被满足时必须释放它已保持的所有资源,待以后需要时再重新申请。实现比较复杂且付出很大代价。可能会造成前功尽弃,反复申请和释放等情况。
      iii.摒弃“环路等待”条件
    1. 避免死锁
      采用避免死锁的方法则是只施加较弱限制条件,从而获得令人满意的系统性能。
      在这里插入图片描述
    1. 银行家算法避免死锁
      最有代表性的避免死锁的算法,是Dijkstra的银行家算法。由于该算法能用于银行系统现金贷款的发放而得名。
      【思路描述】:随时对系统中的所有资源信息进行统计,包括每种资源的数量、已分配给各进程的数量;每当进程提出某种资源请求时判断该请求分配后是否安全,如果安全才分配。对每个资源请求的处理都要保证系统始终从一个安全状态到另一个安全状态。

3.6 死锁的检测与解除

当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此系统必须:
保存有关资源的请求和分配信息;
提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。

死锁定理
利用资源分配图简化法来检测死锁。
简化方法如下:
1.在资源分配图中找出一个既不阻塞又非独立的进程结点Pi,在顺利的情况下运行完毕,释放其占有的全部资源。
2.由于释放了资源,这样能使其它被阻塞的进程获得资源继续运行。消去了Pi的边。
3.经过一系列简化后,若能消去图中所有边,使结点都孤立,称该图是可完全简化的。

  • S状态为死锁状态的充分条件是当且仅当S状态的资源分配图是不可完全简化的。<死锁定理>

死锁检测算法:
每个进程和资源指定唯一编号
设置一张资源分配表
记录各进程与其占用资源之间的关系
设置一张进程等待表
记录各进程与要申请资源之间的关系
反复检测这两张表,列出所有等待与分配的关系,若出现循环等待,则出现了死锁!
死锁的解除
当发现进程死锁时,便应立即把它们从死锁状态中解脱出来。常采用的方法是:
剥夺资源。从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态。
撤销进程。最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止。
死锁处理方法比较
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值