linux - 谁调度线程?

标签 linux multithreading operating-system cpu scheduling

我有一个关于调度线程的问题。一方面,我了解到线程在 Linux 中被调度并被视为进程,这意味着它们像使用传统方法的任何其他进程一样被调度。 (例如linux中的Completely Fair Scheduler)

另一方面,我也知道 CPU 也可能使用 Switch on Event 或 Fine-grain 等方法在线程之间切换。例如,在缓存未命中事件中,CPU 切换线程。但是如果调度器不想切换线程呢?他们如何就一项行动达成一致?

我真的很困惑这两者:谁来安排线程?操作系统还是 CPU?

非常感谢:)

最佳答案

答案都是。

发生的事情非常相当简单:在支持每个内核多线程的 CPU 上(例如,具有超线程的 Intel),CPU 在操作系统看来具有一定数量的虚拟内核。例如,Intel i7 有 4 个实际内核,但在操作系统看来却是 8 个内核。

操作系统将 8 个线程调度到这 8 个(虚拟)内核上。当需要进行任务切换时,操作系统的调度程序会查看线程并找到最适合运行的 8 个线程(考虑线程优先级、自上次运行以来的时间等)

CPU 只有 4 个真正的核心,但是这些核心支持同时执行多条指令(并且在没有依赖关系的情况下乱序执行)。传入的指令被解码并扔进“池”。每个时钟周期,CPU 都会尝试在该池中找到一些不依赖于某些先前指令结果的指令。

如果每个内核有多个线程,那么基本上每个实际内核都有两个输入流可以放入指令“池”中,它可能能够在给定的时钟周期内执行。每个时钟周期它仍然从该池中查找不依赖于尚未完成执行的先前指令的结果的指令。如果它找到一些,它会将它们放入执行单元并执行它们。唯一的主要变化是每条指令现在都需要附加某种标签来指定将使用哪个“虚拟核心”将结果存储到——也就是说,两个线程中的每一个都有(例如)自己的一组寄存器,来自每个线程的指令必须写入该虚拟内核的寄存器。

但是,CPU 有可能支持某种程度的线程优先级,这样(例如)如果可用指令池包括来自两个输入线程(或所有 N 个输入线程,如果有超过2)在任何给定的时钟周期中,它会更愿意选择来自一个线程的指令而不是来自另一个线程的指令。这可以是绝对的,因此它尽可能快地运行线程 A,而线程 B 只能使用周期 A 不能使用,或者它可以是一种“更温和”的偏好,例如尝试保持 2:1 的指令执行比例(或者,当然,基本上是首选的任何其他比率)。

当然,还有其他设置优先级的方法(例如划分执行资源),但总体思路是一样的。

像这样了解共享核心的操作系统也可以修改其调度以适应,例如如果线程具有更高的优先级,则只在一对核心上调度一个线程。

关于linux - 谁调度线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614301/

相关文章:

linux - 使用 awk 或类似的东西按特定列中值的差异逐行解析

linux - WHOIS 服务器守护进程

c - 我的消费者线程没有正确读取生产者线程的产品

macos - 如何递归使用 JpegTran(命令行)优化子目录中的所有文件?

c++ - 泄漏的内存是否会在 C/C++ 程序运行期间始终丢失?

linux - 查找抛出路径必须先于脚本中的表达式

regex - 在sed中,如何表示 "alphanumeric or _ or -"

java - 子线程异常

multithreading - Delphi XE7 Canvas 在线程中拉伸(stretch)

c - 如何指定批处理文件中的输入结束