50

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

4

4 回答 4

43

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

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

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

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

于 2009-01-21T09:26:08.447 回答
18

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

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

于 2009-01-21T08:53:21.710 回答
10

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

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

于 2009-01-21T13:22:03.710 回答
2

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

于 2012-07-02T10:32:16.270 回答