调度员在实时操作系统中

时间:2014-06-30 13:20:53

标签: c++ c operating-system rtos

我正在阅读以下链接中的实时概念

http://www.embeddedlinux.org.cn/RTConforEmbSys/5107final/LiB0024.html

这里在4.4.4节中提到了

  

调度程序是执行上下文的调度程序的一部分   切换并改变执行流程。任何时候RTOS都是   运行,执行流程,也称为控制流程,是   通过三个方面之一:通过一个应用程序任务,   通过ISR,或通过内核。当任务或ISR成为   系统调用,控制流传递给内核执行一个   内核提供的系统例程。什么时候到   离开内核,调度员负责传递控制权   到用户应用程序中的任务之一。它不一定   与进行系统调用的任务相同。

     

这是调度算法(稍后将讨论)   调度程序,确定接下来执行哪个任务。它是   执行上下文切换和传递的实际工作的调度程序   执行控制。

     

根据内核首次输入的方式,可能会发生调度   不同。当任务进行系统调用时,调度程序习惯   每次系统调用完成后退出内核。在这种情况下,   调度程序用于逐个呼叫,以便它可以协调   任何系统调用可能具有的任务状态转换   造成的。 (例如,一个或多个任务可能已准备好运行。)

     

另一方面,如果ISR进行系统调用,则调度程序是   绕过,直到ISR完全执行完毕。这个过程是   即使某些资源已被释放,通常也是如此   触发任务之间的上下文切换。这些上下文切换不会   发生的原因是ISR必须完成而不会被中断   任务。 ISR完成执行后,内核退出   调度程序,以便它可以调度正确的任务

我对上述文字的质询是

  1. 作者的意思是“当一个任务进行系统调用时,调度程序用于退出内核 每次系统调用完成后。在这种情况下,调度程序在逐个调用的基础上使用,以便它可以协调任何状态的任务状态转换 系统调用可能会导致。“。具体来说,调度程序的作者用来退出内核。
  2. 谢谢!

2 个答案:

答案 0 :(得分:3)

作者提供了一个实时系统架构的简化说明,其中控制线程可以处于三种状态之一 - 内核模式(系统调用),应用程序模式(TASK)或中断服务例程(ISR)模式。

此示例中的调度程序是一个内核例程,它在退出其中一个应用程序TASK发出的每个系统调用后决定要接收控制的应用程序TASK。这可能是发出系统调用的TASK,也可能是不同的TASK,具体取决于所遵循的调度算法和规则。

基于系统的计划使用,调度规则和算法有很多变化;作为一个例子,您可能会想到每个TASK每分钟都有相同的CPU时间 - 因此,如果正在执行3个应用程序任务,则每个应该每分钟接收20秒的CPU时间。在这种情况下,调度程序可以决定接收控制的下一个TASK是在最后一分钟内累计CPU时间最少的TASK,以尝试在TASKS上平均分配每分钟的CPU时间。

在决定下一次接收控制的TASK之后,调度员将退出系统调用模式并将控制转移到应用程序TASK,因此调用调度程序相当于"退出"内核并将控制转移到符合条件的应用程序TASK。

作者指出,这是实时系统,这意味着将重点放在应用程序处理(TASKS)上的中断(通过ISR)的快速处理。为了最小化ISR发出系统调用时每个中断所消耗的时间,内核将直接返回到该ISR而不是通过调度程序退出#34;这将允许控制应用程序TASK。

当ISR完成其处理时,其退出将以导致内核调用调度程序的方式执行(因此它将通过调度程序退出),因此应用程序TASK可以再次使用CPU。

作为补充说明:此解释中隐藏的假设之一是应用程序TASKS和中断服务例程(ISR)可以调用相同的内核例程(系统调用)。这很常见,但安全性和性能问题可能需要ISR和TASKS的不同内核例程(系统调用)。

答案 1 :(得分:1)

系统调用完成后,必须将控制权传递回用户空间任务。可能有许多用户空间任务等待运行,它们可能具有不同的优先级。调度员使用它的算法根据优先级和其他标准评估等待任务(等待多长时间?我预计他们需要多长时间?)然后启动其中一个。

例如,您可能有一个需要从命令行读取输入的应用程序。因此,您的应用程序调用read()系统调用,该调用将控制权传递给内核。 read()完成后,调度程序将评估等待运行的任务,并可能决定运行另一个任务而不是调用read()的任务