嵌入式基础知识-系统调度

系统调度是操作系统重要功能,在嵌入式开发,也要了解系统调度的基本原理。对于嵌入式Linux开发,一般使用多线程和多进程开发,对于运行RTOS的嵌入式系统,一般使用多任务开发。这些线程、进程、任务的调度,有许多相似之处。

1 进程的三种状态

  • 执行态(Run):进程占用CPU资源,对于单核处理器,任一时刻只能有一个进行处于执行态
  • 就绪态(Ready):进程本身具备运行条件,但由于处理机的个数少于可运行进行从个数,暂未运行,等待处理机资源
  • 等待态(Wait):也称挂起态(Suspended)、阻塞态、封锁态(Blocked)、睡眠态(Sleep)。该状态时,进行不具备运行条件,即使分给它处理机也不能运行。

嵌入式基础知识-系统调度_第1张图片

  • (a):某个运行条件不能满足(如等待资源)
  • (b):等待条件消失(如等待的资源已经获得满足)
  • ©:就绪队列中的进程获得CPU的使用权
  • (d):进程资源放弃CPU使用权,或被强制剥夺CPU使用权

2 进程切换

进程切换是指,操作系统为了控制进程的执行,必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,也称为任务切换,或上下文切换。

或者说,进程切换就是从正在运行的进程中收回处理器,再使待运行的进程占用处理器。

结合上面介绍的进程三种状态,有如下分析:

  • 当一个进程从运行态变成了阻塞态或就绪态,或完成工作被撤销,则该进程不再占用CPU,操作系统会进行进程调度,从就绪队列中重新选择一个进程执行
  • 当一个进程从就绪态变成运行态,则意味着操作系统将之前运行的进行切换,当前的进行开始占用CPU
  • 当一个进程从阻塞态变成就绪态,则该进程只是进入就绪队列,不会引起进程调度

3 AUTOSAR任务状态

AUTOSAR(Automotive Open System Architecture),中文是“汽车开放系统架构”,是一家致力于制定汽车电子软件标准的联盟.

嵌入式基础知识-系统调度_第2张图片

AUTOSAR中定义的任务有两个类别:

  • 基础任务:只有运行、阻塞、就绪三个状态。
  • 扩展任务:在基础任务的基础上,多了一个等待状态。

各任务状态的特点如下:

  • 运行态:在任何一个时间点只有一个任务处于运行状态
  • 就绪态:所有任务都要转换为就绪态后才能转换为运行态,调度器决定哪一个就绪的任务将是下一个执行的任务
  • 阻塞态:处于阻塞态的任务是被动的,可以被激活
  • 等待态:处于等待态的任务将不能继续执行,它将等待至少一个事件发生

嵌入式基础知识-系统调度_第3张图片

  • (a) 触发:一个新任务被设置成就绪状态
  • (b) 启动:一个就绪任务被调度器选择去执行
  • © 被抢占:调度器决定去执行另一任务,使得运行态任务进行就绪态
  • (d) 挂起:运行态任务通过调用系统服务使其转为阻塞态
  • (e) 等待:通过一个系统服务引起状态转换到等待态,等待任务等待一个事件,以能够继续操作
  • (f) 激活:至少一个任务等待的事件发生

4 RTOS任务切换

RTOS(Real Time Operating System),实时操作系统,指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

嵌入式基础知识-系统调度_第4张图片

RTOS属于多任务系统,与进程切换的思想类似,多个任务也会进行任务的调度与上下文切换。

任务上下文是任务控制块(TCB)的组成部分,上下文切换由RTOS内部完成,并且上下切换时间是影响RTOS性能的重要指标。

下图为FreeRTOS的任务调度示意图。

嵌入式基础知识-系统调度_第5张图片

  • 1 任务创建完成后进入就绪态,表明任务已准备就绪,随时可以运行,只等待调度器进行调度。
  • 2 发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态。
  • 3 有更高优先级任务创建或者恢复后,会发生任务调度。
  • 4 正在运行的任务发生阻塞(挂起、延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。
  • 5 阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表;如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。
  • 6、7、8 任务可以通过调用vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,除非它从挂起态中解除。
  • 9 把一个挂起状态的任 务恢复的唯一途径就是调用vTaskResume() 或vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。

5 总结

本篇介绍了系统调度的基础知识,包括进程的三种基本状态,进程切换,AUTOSAR与RTOS的任务切换基础知识。

你可能感兴趣的:(嵌入式系统基础,嵌入式,系统调度)