【问题标题】:Can kernel schedule user level threads of same process on different cores?内核可以在不同内核上调度同一进程的用户级线程吗?
【发布时间】:2016-03-01 04:55:47
【问题描述】:
据我所知,内核不知道它是在执行用户线程还是用户进程,因为内核用户线程是用户进程,它只调度用户进程,而不关心在该进程中运行的是哪个线程。
我还有一个问题,是每个内核就绪队列还是所有内核的单个就绪队列?
我正在阅读this 的论文,上面写着
在现有的 Linux 内核中,可运行线程集是分区的
进入每个核心调度队列大部分私有;在一般情况下,
每个核心只读取、写入和锁定自己的队列。
【问题讨论】:
标签:
multithreading
linux-kernel
【解决方案1】:
Linux 内核调度程序使用“任务”作为其主要的可调度实体。这对应于用户空间线程。对于传统的简单 Unix 风格的程序,进程中只有一个线程,因此可以忽略区别。当然,其他程序可能有多个线程。但在所有情况下,内核只调度任务(即线程)。
因此,您上面的术语与实际情况并不相符。内核并不真正关心它调度的不同线程是属于同一个进程还是不同进程:每个线程都可以独立调度。您可以让来自同一进程的多个线程同时在不同的处理器/内核上运行。
是的,每个内核都有单独的运行队列。
我认为,您引用的论文在措辞上有些误导。特别是,说“一组可运行线程被划分为……”并没有给出完全正确的含义。这听起来像是线程被分为多个组,然后分配给不同的内核并且只能在那里执行。更准确的说法是,每个内核都有一个单独的运行队列,其中包含一组等待执行的线程,并且在常用的情况下,调度程序不需要引用其他内核的队列。
但事实上,线程可以从一个内核迁移到另一个内核。例如,如果有一个线程等待在核心 A 上运行(因此在核心 A 的运行队列中),但核心 A 已经忙于运行其他线程,并且还有另一个不忙的核心,则可能会迁移等待的线程到另一个核心并在那里执行。 (这当然过于简单化了,因为在决定是否/何时迁移线程时还有其他因素。)