为什么我们需要在Linux的交换任务?

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

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

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

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

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

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

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

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

只要没有更好的办法(在该CPU上)执行,并且执行一些体系结构特定的代码来使处于低功率状态的CPU空闲,调度器就会激活它。

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