嵌入式系统 - 任务调度与优先级反转

时间:2021-06-06 18:01:45

教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社


任务管理与调度

任务调度

概述

调度

  • 调度用来确定多任务环境下任务执行的顺序和在获得CPU资源后能够执行的时间长度

  • 操作系统通过一个调度程序来实现调度功能

    • 调度程序以函数的形式存在,用来实现操作系统的调度算法
    • 调度程序本身并不是一个任务,是一个函数调用,可在内核的各个部分进行调用
  • 调用调度程序的具体位置又被称为是一个调度点(scheduling point),调度点通常处于以下位置
    • 中断服务程序的结束位置
    • 任务因等待资源而处于等待状态
    • 任务处于就绪状态时
  • 调度本身需要一定的系统开销,需要花费时间来计算下一个可被执行的任务
    • 竭力使用最优调度方案往往并不是一个明智的办法
    • 高级的调度程序通常具有不可预见性,需要花费更多的时间和资源
  • 简单是实时内核所强调的主要特点,以确保任务的实时约束特性和可预见性是可以管理的

  • 内核的主要职责就是要确保所有的任务都能够满足任务的时间约束特性要求

  • 能够同时适应所有情况的调度算法是不存在的

调度算法

在一个特定时刻用来确定将要运行的任务的一组规则

  • 设计调度程序时,通常需要综合考虑CPU的使用率(CPU utilization)、输入/输出设备的吞吐率、响应时间(responsive time)、公平性、截止时间等因素

  • 调度程序的设计需要优先考虑最重要的需求,然后在各种因素之间进行折衷处理

  • 对于大量的实时调度方法而言,存在着以下几类主要的划分方法

    • 离线(off-line)和在线(on-line)调度
      根据获得调度信息的时机

    • 抢占(preemptive)和非抢占(non-preemptive)调度
      任务在运行过程中能否被打断的处理情况

    • 静态(static)和动态(dynamic)调度

    • 最佳(optimal)和试探性(heuristic)调度

基于优先级的可抢占调度

  • 如果出现具有更高优先级的任务处于就绪状态时,当前任务将停止运行,把CPU的控制权交给具有更高优先级的任务,使更高优先级的任务得到执行

  • 实时内核需要确保CPU总是被具有最高优先级的就绪任务所控制

时间片轮转调度

  • 有两个或多个就绪任务具有相同的优先级,且它们是就绪任务中优先级最高的任务时,任务调度程序按照这组任务就绪的先后次序调度第一个任务,让第一个任务运行一段时间,然后又调度第二个任务,让第二个任务又运行一段时间,依次类推,到该组最后一个任务也得以运行一段时间后,接下来又让第一个任务运行

  • 任务运行的这段时间称为时间片(time slicing)

  • 释放处理器的任务被排到同优先级就绪任务链的链尾,等待再次运行

  • 使实时系统中优先级相同的任务具有平等的运行权利

  • 时间片大小的选择会影响系统的性能和效率

    • 时间片太大,时间片轮转调度就没有意义;
    • 时间片太小,任务切换过于频繁,处理器开销大,真正用于运行应用程序的时间将会减小
  • 不同的实时内核在实现时间片轮转调度算法上可能有一些差异

优先级反转

  • 在有多个任务需要使用共享资源的情况下,可能会出现高优先级任务被低优先级任务阻塞,并等待低优先级任务执行的现象

  • 优先级反转(priority inversion):高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象

  • 阻塞是优先级反转的一种形式

  • 通常的同步互斥机制为信号量(semaphore)、锁(lock)和Ada中的Rendezvous(汇合)等。直接应用这些同步互斥机制将导致系统中出现不定时间长度的优先级反转比较低的任务可调度性情况

  • 在临界区执行的任务在比可能使用该临界区的所有任务的优先级更高的优先级上

优先级继承协议(priority inheritance protocol)

  • 当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用被该任务所阻塞的所有任务的最高优先级作为其执行临界区的优先级

  • 如果由于任务T进入临界区而阻塞了更高优先级的任务,任务T将继承被任务T阻塞的所有任务的最高优先级,直到任务T退出临界区

  • 当该任务退出临界区时,又恢复到其最初的优先级

  • 优先级继承具有传递性

    假设T1,T2,T3为优先级顺序降低的三个任务,如果任务T3阻塞了任务T2,此前任务T2又阻塞了任务T1,则任务T3将通过任务T2继承任务T1的优先级

  • 高优先级任务在两种情况下可能被低优先级任务所阻塞

    • 直接阻塞
      高优先级任务试图获得一个已经被加锁的信号量,该任务将被阻塞
      用来确保临界资源使用的一致性能够得到满足

    • 间接阻塞
      由于低优先级任务继承了高优先级任务的优先级,使得中等优先级的任务被原来分配的低优先级任务阻塞
      用来避免高优先级任务被中等优先级任务间接抢占

  • 系统运行前就能够确定任务的最大阻塞时间

  • 存在的问题

    • 优先级继承协议本身不能避免死锁的发生
    • 任务的阻塞时间虽然是有界的,但由于可能出现阻塞链,使得任务的阻塞时间可能会很长

优先级天花板协议(priority ceiling protocol)

  • 使用优先级天花板协议的目的在于解决优先级继承协议中存在的死锁和阻塞链问题

  • 信号量的优先级天花板为所有使用该信号量的任务的最高优先级

  • 如果任务获得信号量,则在任务执行临界区的过程中,任务的优先级将被抬升到所获得信号量的优先级天花板

  • 任务执行完临界区,释放信号量后,其优先级恢复到其最初的优先级

  • 如果任务不能获得所申请的信号量,任务将被阻塞

两种协议对比

  • 优先级继承协议可能多次改变占有某临界资源的任务的优先级,而优先级天花板协议只需改变一次,从这个角度看,优先级天花板协议的效率高

  • 优先级天花板协议的特点是一旦任务获得某临界资源,其优先级就被抬升到可能的最高程度,不管此后在它使用该资源的时间内是否真的有高优先级任务申请该资源,这样就有可能影响某些中间优先级任务的完成时间

  • 在优先级继承协议中,只有当高优先级任务申请已被低优先级任务占有的临界资源这一事实发生时,才抬升低优先级任务的优先级,因此优先级继承协议对任务执行流程的影响相对要较小