操作系统 第四章


重难点:
  处理器调度、作业调度算法、进程调度算法、进程死锁及解决方案

处理器调度

  • 调度就是对资源分配的决策
    • 操作系统中的调度:作业调度、进程调度、交换调度、设备调度
  • 调度的衡量指标
    • 周转时间 / 平均周转时间

      • 作业提交给计算机到最终完成所花费的时间 t 即为周转时间,说明了作业在系统中停留时间的长短,越短说明调度越有效$$t = t_c - t_s$$   其中 $t_s$ 是作业提交时刻(Start),$t_c$ 是作业完成时刻(Complete)
          单个作业的周转时间不足以表明整个调度的效率,平均周转时间把所有作业的周转时间求平均。越短,意味着这些作业在系统内停留的时间越短,因而系统吞吐量越大,资源利用率越高$$t = (t_1 + t_2 + ... + t_n) / n$$
    • 加权周转时间 / 平均加权周转时间

      • 周转时间与作业大小有关,所以定义加权周转时间 w,表明作业在系统相对停留时间(相对自己的运行时间)$$w = t / t_r$$   其中 $t_r$ 是作业运行时间(Run),它可以表征作业大小。$t$ 是作业周转时间。但实际中 $t_r$ 难以准确衡量
          平均加权周转时间$$w = (w_1 + w_2 + ... + w_n) / n$$
    • 响应时间

      • R = 用户得到对请求的反馈 - 请求提交时刻
    • 其他

      • 公平合理、提高资源利用率、吞吐量;对于一个调度算法不可能满足全部指标,只能侧重几个
          

作业调度

  • 写在前面

    • 作业调度主要针对批处理系统,对于脱机批处理系统,一批作业需要先由专门的输入计算机输入到磁带上,操作员再把磁带移到主计算机,然后启动主计算机,也就是提交之后可能不是马上执行。而联机批处理系统中,作业主要一经提交立刻进入主计算机,也就是提交之后马上执行。
  • 作业状态

  • 作业调度功能

    • 设计数据结构,登记调度所需要的参数
    • 执行指定的算法,从作业的后备队列中选择一个作业
    • 为选中的作业分配资源,创建进程
    • 作业完成时的资源回收
  • 作业调度算法

    • 先来先服务(First Come First Serve)
      • 就是排队,按照作业进入系统的时间先后来挑选作业。先进先运行。
      • 公平合理、容易实现,效率不高。只考虑了等候时间,没考虑运行时间。比如一个晚来的短作业要很久才被执行,此算法不利于短作业,有利于大作业
    • 短作业优先调度算法(Short Job First)
      • 参考运行时间,选运行时间最短的作业运行
      • 思想简单,实现困难(因为要事先知道作业大小,而又无法准确估计作业大小),拥有最小平均周转时间,吞吐量大,但效率不高。忽视了作业等候时间。比如一个早来的长作业很长时间得不到调度,易出现资源“饥饿”现象
    • 高响应比优先调度算法(HRN)
      • 响应比定义:作业的等待时间与作业大小的比值
        响应比 = 等待时间 / 作业大小
           =(系统当前时间 - 作业提交时刻)/ 作业运行时占用处理器时间的总和
            = 1 + 等待时间 / 运行时间
        计算每个作业的响应比,选择响应比高的作业优先运行
      • 特点
        • 综合了先来先服务算法 (FCFS) 和短作业优先算法 (SJF)
        • 响应比 R 与作业的大小成反比,体现 SJF 算法,缺点也是实现困难
        • 响应比 R 与作业的等待时间成正比,体现 FCFS 算法

进程调度

  • 解决进程并发时如何轮流交替运行?进程调度方式解决怎么停下来,进程调度算法解决怎么补新进程上去

  • 进程调度的功能

    • 进程调度方式:简单来说就是正在执行中的进程怎么停下来,以让出处理器
      • 抢占方式(实时、分时操作系统常用)
        • 系统可以基于某些原则(常见的原则有:时间片原则、优先级原则、任务紧迫性、重要性原则等等),在没有任何警告的情况下,让运行的进程停下来,让出处理器
          灵活但是系统开销大
      • 非抢占方式(批处理操作系统常用)
        • 让运行的进程继续执行,除非它自身原因让出处理器,否则一直运行直至完成
          管理简单、系统开销小但是不灵活
    • 进程调度算法:从就绪队列中按照指定的算法选择一个进程,准备执行
      • 先来先服务(FCFS)

        • 按进入就绪队列的先后顺序,优先选择先进入就绪队列的进程
          “进程调度采用先来先服务算法时,因为先进入就绪队列的进程先被选中运行,后来的进程后运行,所以 FCFS 算法导致系统工作流程只能是顺序执行而不能实现并发执行”此说法对吗?不对,因为进程运行过程中可能进入阻塞状态,此时调度程序就可以选择下一个就绪进程运行,实现并发。
      • 时间片轮转算法(RR)

        • 把所有就绪进程按先进先出原则排成队列,新来进程加到队列末尾。从就绪队列的队首移出一个进程,并分配一个时间片 q(允许进程连续使用处理器的最长时间段)。进程以 q 为单位轮流使用 CPU。刚刚运行一个时间片的进程排到队列末尾,等候下一轮运行。不同进程的时间片可以不同,特别的,如果每个进程分配的时间片相同,就叫做简单 RR 算法。
      • RR 算法需要设计一个定时器,定时器为 0 时产生中断。用分配的时间片作为定时器初值

      • 三种情况:

        • 时间片用完,任务还没完成 -> 回到就绪队列末尾,进行新一轮调度
        • 时间片没完,任务完成 -> 立即进行新一轮调度,新一轮分配的时间片独立(不考虑还剩多少时间片)
        • 时间片没完,进程阻塞 -> 立即进行新一轮调度,新一轮分配的时间片独立(不考虑还剩多少时间片)
      • 优点:

        • 公平性:每个就绪进程有平等机会获得 CPU
        • 交互性:每个进程等待(N - 1)× q 的时间就可以重新获得 CPU
      • 改进:

        • 时间片大小可变
        • 组织多个就绪队列
  • 优先数调度算法

    • 根据进程优先级,把 CPU 分配给优先级最高的进程
    • 静态优先级:进程创建时根据当前系统情况赋予进程一个优先级,之后整个进程运行期间,优先级不再改变
    • 动态优先数:进程创建时赋予进程一个初始优先级,之后整个进程运行期间,可以根据系统的状况变化,修改进程的优先级

死锁问题

  • 什么是死锁
    • 对于一组进程 P1、P2、···、Pn(n > 1),它们当前都处于阻塞状态,对于这组进程中的一个进程 Pi,至少存在同组的另一个进程 Pj,Pi 的阻塞状态只能由 Pj 的某个操作执行后才能唤醒,而 Pj 处于阻塞状态,无法执行这个操作,此时,这组进程处于死锁状态
    • 和死循环的区别(没有联系)
      死循环 死锁
      产生 必然性 偶然性
      进程状态 执行状态 阻塞状态
      原因 程序设计不当或编写错误 操作系统的管理、控制
    • 死锁产生的根本原因
      系统拥有的资源数量小于各进程对资源的需求总数
    • 死锁的四个必要条件
      • 互斥条件:每一个进程至少和同组的的另一个进程共享一类临界资源
      • 不剥夺条件:一个进程申请的资源,只能由自己执行归还操作,别的进程不能剥夺
      • 请求与保持条件:进程在申请新资源得不到满足而阻塞时,对原来已经申请分配得到的资源仍然保持着
      • 环路等待条件:一组进程处于死锁,可以对这组进程适当排序后,得到一个等待的环路

死锁的解决方法

  • 死锁预防
    • 在资源分配上采取一定的限制措施,来破坏死锁产生的 4 个必要条件。根本上解决,但很难实现
    • 互斥条件:原则上不能被破坏,打印等个别资源可以采取虚拟技术
    • 不剥夺条件:原则上不能被破坏
    • 请求与保持条件
      • 静态分配:对于一个进程运行所需要的全部资源,要在开始运行之前就一次性地提出申请,系统在全部满足的情况下才实施分配,有一个不满足就都不分配;具有一般性,但事先很难准确地估计进程运行所要全部资源,且降低了资源的利用率
      • 资源暂时释放:进程在申请新资源得不到满足而阻塞时,主动归还已经申请到的所有资源,之后在重新申请;仅限于个别资源的操作;进程不稳定,一直申请-归还-申请-归还
    • 环路等待条件
      • 按序分配:对于一组需要限制的资源,将它们进行编号,其中任意两个资源的编号可以比较大小,规定,一个进程只能申请比它已经获得的所有编号还大的编号的资源;具有一般性,但存在与静态分配的问题,且编号管理困难。
      • 单请求方式:不适用于复杂任务的进程
  • 死锁避免
    • 定义:允许进程动态地申请资源,但系统在资源分配时进行系统的安全状态检查,如果分配后系统处于安全状态
    • 安全状态和安全序列
      • 对于系统所有进程,可以找出一个处理器执行这些进程的顺序,按照这个顺序依次执行各个进程,每个进程都可以运行完成;这个顺序就是安全序列
      • 某一时刻,如果系统当前是不安全状态的,说明一个存在一组进程(就是某个顺序),它们将进入死锁状态。如果系统当前是安全状态的,也有可能存在进程死锁,只有在之后的每次资源分配后,都能保证系统处于安全状态,才能保证不存在进程死锁
    • 银行家算法
  • 死锁检测与恢复
    • 死锁检测:系统不采用死锁预防、避免等方法,允许系统存在进程死锁,但安排一个检测程序,检测到时再处理;原理:进程死锁是小概率事件
    • 死锁恢复:
      • 剥夺资源
      • 撤销进程
      • 重新启动系统
    • 假设某一道程序运行时需要访问临界资源R,该程序可供多个用户同时运行,如果系统拥有资源R的数量为k,而程序申请使用资源R的数量为x(假定程序每次只申请1个,先后分x次申请),有n个用户同时运行该程序。那么,k、x和n满足什么条件下,可以保证用户运行时不会产生进程死锁?
      $$k - n × (x - 1) >= 1$$
posted @ 2020-12-13 05:40  物转星移几度秋  阅读(293)  评论(0)    收藏  举报