为什么我们在linux中需要一个交换器任务?

问题描述 投票:0回答:4

在任务调度时,当运行队列中没有更多可运行的任务时,选择运行空闲任务(也称为交换器任务)。但是这个如此特殊的任务有什么用呢?另一个问题是为什么我在用户空间的“ps aux”输出(PID=0)中找不到这个线程/进程?

linux linux-kernel scheduled-tasks
4个回答
49
投票

原因是历史和计划性的。空闲任务是正在运行的任务,如果没有其他任务可运行,就像您所说的那样。它具有尽可能低的优先级,因此这就是为什么它在没有其他任务可运行的情况下运行的原因。

编程原因:这大大简化了进程调度,因为你不必关心特殊情况:“如果没有任务可运行会发生什么?”,因为总是至少有一个任务可运行,即空闲任务。您还可以计算每个任务使用的 CPU 时间量。如果没有空闲任务,哪个任务占用的CPU时间无人需要?

历史原因:在我们拥有能够降压或进入省电模式的CPU之前,它必须随时全速运行。如果没有任务可运行,它会运行一系列 NOP 指令。如今,空闲任务的调度通常通过使用 HLT 指令(停止)来降低 CPU 的运行速度,从而节省电量。所以我们现在的闲置任务有某种功能。

在Windows中你可以在进程列表中看到空闲任务,它就是空闲进程。


18
投票

Linux 内核维护一个在 IO/互斥锁等上“阻塞”的进程的等待列表。如果没有可运行的进程,则空闲进程将被放入运行队列中,直到被来自等待队列的任务抢占。

它有一个任务的原因是你可以测量(大约)内核由于 IO/锁等阻塞而浪费了多少时间。此外,它使内核的代码更容易,因为空闲任务是相同的因为每个任务都需要上下文切换,而不是“特殊情况”空闲任务,这可能会使更改内核行为变得更加困难。


10
投票

实际上每个 cpu 有一个空闲任务,但它并不保存在主任务列表中,而是保存在 cpu 的“struct rq”runqueue 结构中,作为 struct task_struct * 。

每当(在该 CPU 上)没有更好的事情可做时,调度程序就会激活它,并执行一些特定于架构的代码以使 CPU 处于低功耗状态。


2
投票

您可以使用 ps -ef ,它会列出正在运行的进程号。然后在第一个链接中,它将列出第一个 pid - 0,这是交换器任务。

© www.soinside.com 2019 - 2024. All rights reserved.