为什么我们需要linux中的交换器任务?

时间:2009-01-21 08:50:06

标签: linux linux-kernel scheduled-tasks

当在任务调度点的运行队列中不再有可运行的任务时,选择空闲任务(a.k.a.交换器任务)运行。但这项特殊任务的用途是什么?另一个问题是为什么我无法在用户空间的“ps aux”输出(PID = 0)中找到此线程/进程?

4 个答案:

答案 0 :(得分:32)

原因是历史和编程。如果没有其他任务可以运行,那么空闲任务就是任务正在运行,就像你说的那样。它具有最低可能的优先级,因此它运行没有其他任务的原因是可运行的。

程序原因:这大大简化了流程调度,因为您不必关心特殊情况:“如果没有任务可运行会发生什么?”,因为始终至少有一个任务可运行,即空闲任务。您还可以计算每个任务使用的CPU时间量。没有空闲任务,哪个任务得到了cpu-time,没人需要?

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

在Windows中,您可以在进程列表中看到空闲任务,这是空闲进程。

答案 1 :(得分:16)

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

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

答案 2 :(得分:9)

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

只要没有更好的事情(在那个CPU上),调度程序就会激活它,并执行一些特定于体系结构的代码,以便在低功耗状态下使cpu空闲。

答案 3 :(得分:2)

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