为啥我们在 linux 中需要一个 swapper 任务?

Posted

技术标签:

【中文标题】为啥我们在 linux 中需要一个 swapper 任务?【英文标题】:Why do we need a swapper task in linux?为什么我们在 linux 中需要一个 swapper 任务? 【发布时间】:2010-10-02 15:27:51 【问题描述】:

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

【问题讨论】:

到目前为止,我还没有在任何地方看到它被称为“交换任务”。有 kswapd 负责从/到磁盘交换内存,但我想说那是完全不同的事情(并且确实出现在 PID 列表中) @PypeBros Linux 自己的性能工具将其称为交换任务(perf top 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

HLT 指令早于 linux 调度程序,不是吗? @sylvainulg 我认为确实如此,但如果 linux 调度算法(或至少其中一些)早于 HLT 指令,我不会感到惊讶。 @sylvainulg,这是一个有趣的问题,我不知道在哪里可以找到答案。 Linux 从哪里得到他们的调度算法? PDP-11 有停止指令吗?最初的 UNIX 小组是否更早地从某人那里获得了他们的调度算法? @SamuelEdwinWard:显然,它确实做到了:divms.uiowa.edu/~jones/pdp8/man/micro.html#hlt -- 在 PDP-11 上,看起来 WAIT 是人们会使用的指令,而 HALT 更像是“CLI;HLT” 80x86 行话。 根据 Wikipedia,“从 8086 开始的所有 x86 处理器都有 HLT 指令,但它......直到 1994 年英特尔 DX4 处理器发布之前,它并不是专门为降低功耗而设计的”。 【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于为啥我们在 linux 中需要一个 swapper 任务?的主要内容,如果未能解决你的问题,请参考以下文章

Linux0号进程,1号进程,2号进程

swapper_pg_dir的作用

Linux0号进程,1号进程,2号进程

糟糕:糟糕区域的内核访问,sig:11 - 'swapper' - 查杀中断处理程序

为啥还有内存,SWAP怎么都用上了

为啥内存 NX 需要 Linux 内核中的硬件支持?