选择空闲任务(也称为交换器任务),以便在任务调度点处的运行队列中不再有可运行的任务时运行.但这项特殊任务的用途是什么?另一个问题是为什么我无法在用户区的"ps aux"输出(PID = 0)中找到此线程/进程?
原因是历史和程序.如果没有其他任务可以运行,那么空闲任务就是任务正在运行,就像你说的那样.它具有最低可能的优先级,因此它运行没有其他任务的原因是可运行的.
编程原因:这大大简化了流程调度,因为您不必关心特殊情况:"如果没有任务可运行会发生什么?",因为始终至少有一个任务可运行,即空闲任务.您还可以计算每个任务使用的CPU时间量.没有空闲任务,哪个任务获得cpu-time占用没有人需要?
历史原因:在我们拥有能够降压或进入省电模式的cpu之前,它必须随时全速运行.如果没有可运行的任务,它会运行一系列NOP指令.今天,空闲任务的调度通常通过使用HLT指令(停止)来降低CPU,因此节省了电力.所以在我们这个时代的闲置任务中有某种功能.
在Windows中,您可以在进程列表中看到空闲任务,这是空闲进程.
Linux内核维护一个在IO /互斥锁等上"阻塞"的进程的等待列表.如果没有可运行的进程,则将空闲进程置于运行队列中,直到它被等待队列中的任务抢占为止.
它有一个任务的原因是你可以(大约)测量内核由于IO /锁上的块等而浪费了多少时间.此外,它使代码更容易为内核,因为空闲任务是相同的它需要上下文切换的每个任务,而不是"特殊情况"空闲任务,这可能会使更改内核行为更加困难.
每个cpu实际上有一个空闲任务,但它不在主任务列表中,而是在cpu的"struct rq"runqueue结构中,作为struct task_struct*.
只要没有更好的事情(在该CPU上),调度程序就会激活它,并执行一些特定于体系结构的代码,以便在低功耗状态下使cpu空闲.