Section3 - 处理机调度与死锁

处理机调度与死锁

  • 0.题外话:
    • 处理机:包括中央处理器(CPU)、主存储器、I/O设备
    • CPU:是一块超大规模集成电路。主要是用来解释计算机指令和处理计算机软件中的数据。包括:运算器(ALU)、高速缓冲存储器(Cache)以及实现它们之间联系的数据、控制及状态的总线(Bus)
    • 存储器:
      • 主存储器:简称主存,能被CPU直接随机存取,作用是用来存放指令和数据
Section3 - 处理机调度与死锁_第1张图片
存储器分类.png
  • 1.处理机调度的层次和调度算法的目标
    • 调度实质是资源分配。多道程序环境下,一个作业从提交到执行,到完毕,通常都会经历多级调度:高级、低级、中级调度 等
    • 处理机调度的层次
      • 高级调度(作业调度或长程调度)
        • 用于决定将哪些作业调入内存,并为他们创建进程,分配资源,排在就绪队列上
        • 在批处理系统中,大多配有高级调度,在分时系统和实时系统中,一般不配置
        • 需要高级调度解决的主要任务:从外存后备队列中选择多少作业进入就绪队列(即允许多少作业在内存中运行);若太多,影响系统的服务质量,若太少,影响系统资源的利用率
        • 需要将哪些作业从外存中调入内存,取决于调度算法
      • 低级调度(短程调度或进程调度)
        • 主要任务:从就绪队列中选择一个进程来执行并分配处理机
        • 是OS中最基本的调度,在多到批处理,分时和实时三种OS中,都必须配置这级调度
        • 调用频率非常高,一般几十毫秒一次
        • 常采用非抢占方式抢占方式两种
        • 引起进程调度的因素:
          • 进程正常终止或异常终止
          • 正在执行的进程被阻塞
          • 在有时间片的系统中,时间片用完
          • 在抢占调度方式中,就绪队列中某进程的优先权比当前正执行的进程高
        • 调度方式
          • 非抢占方式
            • 若处理机已经分配给某个进程,只有等这个进程正常完成或者因为某事件堵塞,才会再将处理机分配给其他进程,决不允许某进程抢占已分配出去的处理机
            • 若面临紧急任务,就不适合此方式,故实时系统和分时系统不宜采用
          • 抢占方式
            • 允许调度根据某种原则(时间片、优先级、短进程优先),停止正在进行的进程,将释放出来的处理机重新分配给其他进程
            • 有利于紧急任务,故实时和分时系统常采用
      • 中级调度(内存调度)
        • 引入内存调度的目的
          • 提高内存利用率和系统吞吐量,故将哪些暂时不运行的进程,调到外存中等待,此时进程状态为挂起状态(或就绪驻外状态)
          • 当挂起状态的进程已具备运行条件或者内存有空闲时,中级调度就决定将这些进程重新调入内存,并修改状态为就绪状态
      • 常用于分时系统或具有虚拟存储器的系统中
    • 调度队列模型和调度准则
      • OS中任何一种调度,都将涉及到进程队列,由此形成了三种类型的调度队列模型
      • 只有进程调度的调度队列模型
      • Section3 - 处理机调度与死锁_第2张图片
        Snip20170118_1.png
      • 具有高级、低级调度的调度队列模型

Section3 - 处理机调度与死锁_第3张图片
Snip20170118_3.png

- 同时具有三级调度的调度队列模型
-
Section3 - 处理机调度与死锁_第4张图片
Snip20170118_5.png

- 选择调度方式和算法的若干准则
- 在OS设计中,如何选择调度方式和算法,很大程度上取决于OS的类型和目标,选择调度方式和算法的准则有
- 面向用户的准则
- 周转时间段
- 响应时间快
- 截止时间的保证
- 优先权准则
- 面向系统的准则
- 系统吞吐量
- 处理机利用率好
- 各类资源平衡利用
- 综合最优准则
- 最大的CPU利用率
- 最大的吞吐量
- 最短的周转时间
- 最短的响应时间
- 最短的等待时间
- CPU利用率: CPU有限工作时间/(CPU有限工作时间+CPU空闲等待时间)
- 响应时间:交互式进程从提交一个请求到接受到响应之间的时间间隔
- 周转时间:批处理用户从作业交给系统开始,到作业完成为止的时间间隔。实际为作业在系统中的等待时间和运行时间之和
- 带权周转时间:周转时间/进程要求运行时间
- 吞吐量:单位时间内处理的作业数
- 公平性:确保每个用户每个进程获得合理的CPU份额和其他资源分量
- 调度算法
- 调度的核心问题是采用什么样的算法将处理机分配给进程,常用的进程调度算法
- 完成时间 = 开始时间 + 服务时间
- 周转时间 = 完成时间 - 到达时间
- 等待时间 = 开始时间 - 到达时间
- 带权周转时间 = 周转时间 / 服务时间 = 周转时间 / (周转时间 - 等待时间)
- 先来先服务调度算法(FCFS)
- 既能使用在进程调度,也能使用在作业调度
- 按照进程进入就绪队列的先后次序来分配处理机(或者优先考虑系统中等待时间最长的作业),一般采取非剥夺的调度方式
- 存在的问题:表面上看对所有作业都是公平的,但若一个长作业先到达系统,就会使得许多短作业等待很长时间,影响系统执行的效率。故在OS中较少采用该算法作为主要的调度策略。但经常被结合其他调度策略使用
-
Section3 - 处理机调度与死锁_第5张图片
Snip20170118_8.png

-
Section3 - 处理机调度与死锁_第6张图片
Snip20170119_3.png

- 短作业/进程优先调度算法(SJF/SPF)
- SJF使用在作业调度,SPF使用在进程调度
- 主要任务是从作业后备队列或者进程的就绪队列中选出一个或若干个估计运行时间最短的作业或进程,调入内存运行或者将处理机分给他
- SPF可采用抢夺或非抢夺调度方式
-
Section3 - 处理机调度与死锁_第7张图片
Snip20170119_5.png

-
Section3 - 处理机调度与死锁_第8张图片
Snip20170119_6.png

- SJF/SPF调度算法的优缺点
- 优点
- 有效降低作业的等待时间
- 提高吞吐量
- 有效降低进程的周转时间
- 缺点
- 对长作业不利
- 不考虑作业的紧迫程度
- 作业执行时间和剩余时间只是 估计时间
- 所以虽然SJF/SPF算法有优化,但在CPU中很难实现
- SPF与FCFS算法比较
-
Section3 - 处理机调度与死锁_第9张图片
Snip20170119_9.png

-
Section3 - 处理机调度与死锁_第10张图片
Snip20170119_11.png

-
Section3 - 处理机调度与死锁_第11张图片
Snip20170119_13.png

-
Section3 - 处理机调度与死锁_第12张图片
Snip20170119_14.png

-
- 时间片轮转调度算法(RR)
- 系统将原所有就绪进程按照FCFS算法,排成一个队列,依次调度,将CPU分配给队首的进程,并设定一个时间片(10~100ms),时间片走完后,这个进程被抢占,并将这个进程插入到就绪队列的队尾
- 一般应用于分时OS中,能保证及时响应用户的请求,90年代后更多采用多级反馈队列调度算法
- 保证了系统在给定的时间内,能响应用户的所有请求
- 若时间片大于进程的执行时间,进程则自愿释放CPU
- 不同长度的时间片的影响
- 调度算法(太长->FCFS)
- 上下文切换(太短->上下文切换频繁)
- 平均周转时间
-
Section3 - 处理机调度与死锁_第13张图片
Snip20170119_16.png

- 优先权调度算法
- 非抢占式优先权算法
- 系统一旦把处理机分配给就绪队列中优先级最高的进程后,这个进程就一直执行,直到完成或者因发生某事件而放弃处理机,系统才重新分配处理机
- 抢占式优先权算法
- 系统把处理机分配给就绪队列中优先级最高的进程,执行之,但若就绪队列中出现比正在执行进程优先级高的进程,先暂停正在执行的进程,将暂停的进程放到就绪进程中,将处理机分配给优先级更高的进程
- 优先权的类型
- 静态优先权:优先权在创建进程时确定,并在进程的执行期间保持不变,一般用整数表示,越小优先级越高
- 动态优先权:优先权在创建进程时确定,但在进程执行期间会发生变化①根据进程占据CPU时间多少来决定,占有CPU时间越长,被阻塞后再次获得调度的优先级越低②根据进程等待CPU时间来决定,当进程在就绪队列中等待时间越长,被阻塞后再次获得调度的优先级越高,反之,越小
-
Section3 - 处理机调度与死锁_第14张图片
Snip20170119_17.png

-
Section3 - 处理机调度与死锁_第15张图片
Snip20170119_18.png

- 高响应比优先调度算法(HRRN)
- FCFS与SJF都是片面的调度算法
- FCFS只考虑作业的等候时间而忽视了作业的计算时间
- SJF只考虑用户估计的计算时间而忽视了作业的等候时间
- HRRN是介于这两种之间的折中算法,既考虑作业等待时间,又考虑作业的计算时间,既照顾短作业又不使长作业的等待时间过长,改进了调度性能
- 优先权变化为
- 优先权 = (等待时间 + 要求服务时间) / (要求服务时间) = 响应时间 / 要求服务时间 = Rp
- Rp为响应比
- 注:
- 等待时间相同,要求服务时间越短,优先权越高 -- SPF
- 如要求服务时间相同,优先权取决于等待时间 -- FCFS
- 对长作业,若等待时间足够长,优先权也高,也能获得CPU
- 算法举例
-
Section3 - 处理机调度与死锁_第16张图片
Snip20170120_2.png

- 多级反馈队列调度算法
- 是时间片轮转算法和优先级调度算法的综合和发展,通过动态调整进程优先级好时间片大小,不必事先估计进程的执行时间。因为多级反馈队列可坚固多方面的系统目标,是目前公认的一种较好的进程调度算法
- 设置多个就绪队列。给每个队列赋予 不同的优先级,队列一优先级最高,其余依次降低
- 每个队列中进程执行时间片的大小各不相同,进程所在队列优先级越高,相应的时间片就越短
- 当一个 新进程进入系统时,首先将它放入队里1的队尾,按照FCFS等待调度,如能完成,便可准备撤出系统,反之由调度程序将其转入队列2的末尾,按照FCFS再次调度,如此下去,进入队列n按照RR算法调度执行
- 仅当队列1为空时,才调度队列2中的进程执行。若队列i中的进程正在执行,此时有新进程进入优先级较高的队列(1~(i-1)队列)中,则新进程将抢占运行,原进程转移至本队列(第i队列)的末尾
- 死锁的基本概念
- 死锁
- 指多个进程因运行过程中抢夺资源而产生的一种僵局(deadly-Embrace),若无外力作用,这些进程都将无法向前推进
- 注意:
- 产生死锁的进程数至少为2
- 参与死锁的所有进程均等待资源
- 参与死锁的进程至少有两个占有资源
- 参与死锁的进程是系统中当前正在运行进程的一部分
- 产生死锁的原因

            -  竞争资源
                -    资源分类
                    -    根据资源本身的性质
                        -    可剥夺资源:如主存、CPU
                        -    不可剥夺资源:如驱动器、打印机
                    - 根据资源使用期限
                        -     永久性资源:可再次使用的资源,如所有硬件
                        -      临时性资源:消耗性的资源,如消息、信号和数据
                -       竞争非剥夺性资源
                -       竞争临时性资源
            - 进程推进顺序不当引起死锁       
        -    产生死锁的必要条件(Coffman条件)
            -    互斥条件(资源独占条件)
            -    请求和保持条件(部分分配条件)
            -    不剥夺条件
            -    循环等待条件(环路条件)
        -    处理死锁的基本方法
            -    预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或多个,来防止死锁的产生
            -    避免死锁:指在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的产生
            -    检测死锁:允许系统在运行时出现死锁,但可通过设置检测机构及时检测死锁的产生,并采取适当措施加以清除
            -    解除死锁:当检测出死锁后,便采取适当措施将进程从死锁状态中解脱出来
        -  死锁的预防
            -      破坏死锁的四大必要条件(常针对条件2,3,4)
            -      破坏互斥条件(不可行)
                -      即允许多个进程同时访问资源,但有的资源本身固有特性的限制,根本不能同时访问,只能互斥访问,所以不能用破坏互斥条件来预防死锁
            -      破坏请求和保持条件
                -      采用预先静态分配方法,即要求进程运行之前只能申请一次资源,在请求的资源未得到满足之前,不能投入使用。一旦运行后,这些资源全归其占有,同时它不能再提出其他资源请求,这样就能保证系统不会发生死锁
                -      这个方法虽然简单安全,但是降低了资源利用率,同时必须提前预知进程所需要的全部资源
            -      破坏不可剥夺条件
                -      一个已经获得一些资源的进程,若又请求新的资源不能够得到满足,那么这个进程必须释放出已经获得的所有资源,以后需要资源时再请求。即一个进程已获得的资源在运行过程中是可剥夺的,从而破坏了"不剥夺"条件
                -      这个实现叫复杂,会增加系统开销,降低系统吞吐量
            -      破坏环路条件
                -        可采用有序资源分配方法,即将系统中所有资源都按照类型赋予一个编号,要求每一个进程均严格按照编号递增的次序来请求资源,同类资源一次申请完。也就是,只要进程提出请求资源Ri,则在以后的请求中,只能请求Ri后面的资源,这样不会出现几个进程请求资源而形成环路。
                -        虽然提高了资源利用率,但编号难,加重进程负担及因使用资源顺序与申请顺序不同而在成资源浪费
        -   死锁的避免
            -  死锁预防的方法,都施加了较强的限制条件,严重降低了系统性能
            -  在死锁避免的方法中,所施加的限制条件较弱,对于进程发出的每一个资源申请命令实施动态检查,并根据检查结果决定是否实施资源分配
            -  在这个方法中把系统的状态分为*安全状态*和*不安全状态*。只要能使系统始终处于安全状态,便可以避免出现死锁
            -  系统的安全状态
                -    在某一时刻,系统能按照某种进程顺序(P1,P2,...,Pn)来为每个进程Pi分配其资源,直到满足每个进程对资源的最大需求,使每个进程都能顺利完成,称此时的系统状态为*安全状态*,称序列(P1,P2,...Pn)为*安全序列*。
                -    若某一时刻系统中不存在这样一个安全序列,就称此时的系统状态为*不安全状态*.
                -    *注:*在死锁避免方法中,允许进程动态申请资源,系统在进行资源分配之前,先计算资源分配的安全性,若此次分配不会导致系统进入不安全的状态,便将资源分配给进程,否则进程就等待
            - 安全、不安全、死锁状态空间
                -    基本事实
                    -    如果一个系统在安全状态,就没有死锁
                    -    如果一个系统在不安全状态,就有可能死锁
                    -    避免死锁的实质:确保系统不进入不安全的状态
            -  安全状态实例
            -  ![Snip20170120_12.png](http://upload-images.jianshu.io/upload_images/2979388-32498df50e4540a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        - 避免死锁的算法 (银行家的算法)
            -   这个算法本来是给银行系统设计的,确保银行发放现金贷款时,不会发生不能满足客户所有需要的情况。这里也能用来避免死锁

你可能感兴趣的:(Section3 - 处理机调度与死锁)