据我所知,内核并不知道它是在执行用户线程还是用户进程,因为内核用户线程是用户进程,它只调度用户进程而不关心正在运行的线程在那个过程中。
我还有一个问题,是否每个核心就绪队列或所有核心都有一个就绪队列?
我正在阅读this论文,而且写的是
在库存Linux内核中,可以运行一组可运行线程 进入大多数私有的每核心调度队列;在一般情况下, 每个核心只读取,写入和锁定自己的队列。
答案 0 :(得分:1)
linux内核调度程序使用"任务"作为其主要的可调度实体。这对应于用户空间线程。对于传统的简单Unix风格的程序,进程中只有一个线程,因此可以忽略这种区别。其他程序当然可能有多个线程。但在所有情况下,内核只调度任务(即线程)。
因此,您的术语与上述情况并不匹配。内核并不关心它调度的不同线程是否是同一进程或不同进程的一部分:每个线程都可以独立调度。您可以在同一时间在同一进程中运行多个线程。
是的,每个核心都有单独的运行队列。
我认为你提到的论文在措辞上有些误导。特别是,说"可运行线程集被划分为......"并没有给出正确的意思;这听起来好像线程被分成多个组,然后分配到不同的核心,并且只能在那里执行。更准确地说,每个核心都有一个单独的运行队列,其中包含一组等待执行的线程,并且在通常使用中,调度程序不需要引用其他核心的队列。
但事实上,线程可以从一个核心迁移到另一个核心。例如,如果有一个线程等待在核心A上运行(因此在核心A的运行队列中),但是核心A已经忙于运行其他一些线程,并且还有另一个核心不忙,等待线程可以迁移到那个其他核心并在那里执行。 (当然,这是一个过于简单化的过程,因为在决定是否/何时迁移线程时还有其他因素。)