VxWorks调度器是如何执行的?

10

我想知道调度器是如何被调用以便可以切换任务的。即使是抢占式调度或循环调度,调度器也应该介入进行任何类型的任务切换。假设一个低优先级任务有一个无限循环 - 当调度器介入并切换到高优先级任务时会发生什么?

问题是: 1. 谁调用调度器? [在VxWorks中] 2. 如果它定期被调用 - 那么这种机制是如何实现的?

谢谢。

--Ashwin


虽然我不了解VxWorks,但在其他操作系统中,调度程序通常由定时器中断调用,因此即使一个任务当前正在忙碌,它也可以切换任务。 - Rudi
4个回答

15

简单的回答是,vxWorks通过系统计时器不断地以固定时间间隔产生硬件中断来控制系统。

以下是更详细的说明:

当vxWorks启动时,它会配置你的硬件生成一个定时器interrupt,每n毫秒触发一次中断,其中n通常为10,但完全取决于你的硬件。定时器间隔通常在vxWorks启动时由你的Board Support Package (BSP)设置。

每次计时器触发中断时,系统开始执行计时器interrupt handler。计时器中断处理程序是vxWorks的一部分,因此现在vxWorks控制着系统。它做的第一件事是将CPU状态(例如寄存器)保存到当前运行任务的Task Control Block (TCB)中。

然后最终vxWorks运行调度器以确定下一个运行的任务。为了运行一个任务,vxWorks将任务的状态从其TCB复制到机器寄存器中,完成后该任务控制CPU。
额外信息:
vxWorks提供hooks来连接到任务切换逻辑,这样您就可以在任务被抢占时调用函数。

请注意,只有在启用轮询调度(通过调用kernelTimeSlice()函数)时才成立,否则默认为基于优先级的抢占式调度。 - nos
@nos:定时器中断始终在运行,以跟踪滴答计数、看门狗定时器和信号量超时,而不管调度策略如何。对于基于优先级的抢占式调度,vxWorks调度程序只有在某些定时器操作将更高优先级任务移动到就绪队列时才选择要运行的新任务。但是说得好。我一直想更新这个答案,使其更加精确并包括系统调用,但当时完全忘记提到它们了。 - indiv
还应该记住,轮询调度是基于优先级的调度的补充。无论如何,您都会得到基于优先级的调度。轮询调度仅影响同一优先级级别内的任务。此外,即使在仅基于优先级的情况下,任务仍然可以使用例如taskDelay,因此系统时钟仍需要继续运行。 - mjs

6
indiv提供了一个非常好的答案,但它只是部分准确的。
系统的实际工作稍微复杂一些。
调度程序可以由同步或异步操作的结果执行。
同步指由当前正在执行的任务中的代码引起的操作。一个典型的例子就是获取信号量(semTake)。
如果信号量不可用,则当前执行的任务将挂起并不再可用于执行。此时,调度程序将被调用,并确定应该执行的下一个任务,并执行上下文切换。
异步操作基本上是指中断。计时器中断由indiv非常好地描述。但是,许多不同的元素都可能导致中断执行:网络流量、传感器、串行数据等等...
还要记住,定时器中断不一定会导致上下文切换!是的,中断会发生,延迟任务和时间片计数器将被递减。然而,如果时间片没有过期,或者没有更高优先级的任务从挂起状态转换到就绪状态,那么调度程序实际上不会被调用,你将返回到原始任务,在执行被中断的确切点。
请注意,调度程序没有自己的上下文;它不是任务。它只是在调用它的任何上下文中执行的代码。无论是来自中断上下文(异步)还是来自调用任务上下文(同步)。

请注意,调度程序没有自己的上下文;它不是一个任务。它只是在调用它的上下文中执行的代码。可以是从中断上下文(异步)或从调用任务上下文(同步)中执行。我相信这对大多数操作系统都是正确的,无论是实时的还是非实时的。 - AjB

0

除非您有一个主要定制的目标构建,否则调度程序将由计时器中断调用。但是,详细信息因平台而异。


0
调度程序还会在当前任务完成或阻塞时被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接