Linux – 线程和进程调度优先级

如果我们在linux上使用默认调度策略创buildpthreads(pthread_create)或进程(fork),那么调度器会在调度它们时将进程和线程的优先级视为相同的优先级吗?

让我们说,有一个线程的进程P1和P2线程T1 T2的进程

可以说只有一个核心。调度是P1 P1 P1 T2 P1 T1 P1 T2

要么

P1 T1 T2 P1 T1 T2

Solutions Collecting From Web of "Linux – 线程和进程调度优先级"

Linux不再安排进程。

在内核中, 线程被调度。 一个进程的概念现在是一个人为的构造,大部分是由内核之外的东西所看到的。 显然,内核必须知道线程是如何绑定在一起的,但不是用于调度目的。

基本上,内核维护了大量的线程,每个线程都有一个线程组领导,这就是进程外部所看到的。 一个线程有一个线程ID和一个线程组ID–这就像一个PID和一个PPID(进程ID和父进程ID)之间的关系。

当你创建一个普通的线程时,内核给它一个全新的线程ID,但是它的线程组ID被设置为与创建它的线程的组ID相同。 这样,它看起来像一个进程内的线程外部世界。

当你fork的时候,内核给它一个全新的线程ID,并且把它的线程组ID设置成与它的线程ID相同的值。 这样看起来就像一个外部世界的过程。

大多数报告进程的非内核实用程序实际上只报告线程ID与线程组ID相同的线程。

其他方法的细微之处可能太复杂了。 我上面写的是(希望)一个好的中等水平的论文。

现在,针对你的具体问题,既然P1只有一个线程(没有P1T2 ),那也不是这种情况。

使用内核,线程是P1T1P2T1P2T2 ,假设它们具有相同的调度属性并且行为相同(a) ,那么它们将如何被调度。


也可以看看:

  • Linux – 线程和进程 ;
  • 如果我有一个过程,我克隆它,PID是一样的吗? ; 和
  • 一个CPU进程是否至少有一个线程?

了解更多信息。


(a) :很显然,如果线程开始阻塞I / O(内核将不会安排它们,直到I / O可用),或者提前释放它们的时间量(内核可能会提高优先级,但是他们的行为不一样

确实,Linux内核(从版本2.6.23开始)计划任务,这些任务是线程或(单线程)进程。

除了paxdiablo接受的答案之外,我还添加了这个,以便为线程调度的不同方式增加一个更全面的信息性视图。

一般来说, 线程既可以是用户空间线程也可以是内核空间线程 。 用户空间线程通常由一个库实现。 因此,内核对它们几乎一无所知(内核只知道它所属的进程),并且它们在用户空间中处理。 相反,内核线程是由内核来实现的,它们完全由内核来处理。 您可以从以下图像中获取通用视图。

在这里输入图像说明

如您所见,左图显示了一些用户空间线程,其中内核只拥有关于进程的信息(所谓的进程控制块–PCB )。 所有有关线程的资源信息都保存在进程内(在线程表中),并由用户空间中相应的线程库进行处理。 在右图中,您可以看到内核线程,其中进程表和线程表都保存在内核中。

内核线程的一个例子是LinuxThreads ,现在已经被更现代的NPTL库取代了。 用户空间线程的一个例子是GNU可移植线程库

现在,就调度而言,正如预期的那样,用户空间线程以与内核线程不同的方式进行调度:

  • 当使用用户空间线程时,调度程序正在调度进程。 因此,它选择一个特定的过程并分配允许的时间量。 然后,进程内的线程调度程序负责选择如何在线程之间进行调度。 由于用户空间线程不会被中断阻止,因此所选线程将倾向于占用整个进程量,直到完成其任务。 所以,这种情况下的假设调度将会是这样的:

    P1(T1),P2(T1),P1(T1),P2(T1-T1完成任务并产出 ),P2(T2-对于剩余时间量,P1(T1),P2(T2) ),..

  • 当使用内核线程时,内核调度线程。 内核对线程所属的进程没有兴趣,而是对每个线程平均分配一个时间量。 所以,在这种情况下,假设的调度将是:

    P1(T1),P2(T1),P2(T2),P1(T1),P2(T2),P1(T1)…


请注意,还有另一个类别,即混合线程 ,其中一些用户空间线程被转换为一个内核线程。 但是,它更复杂,需要更彻底的分析。