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

Med*_*ine 13 linux scheduling pthreads process

如果我们在linux上使用默认调度策略创建pthreads(pthread_create)或进程(fork),调度程序是否会在调度它们时处理具有相同优先级的进程和线程?

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

假设只有一个核心......调度将是P1 T1 P1 T2 P1 T1 P1 T2

要么

P1 T1 T2 P1 T1 T2

pax*_*blo 29

Linux根本不再安排进程.

在内核中,线程被调度.过程的概念现在是一个人工构造,主要由内核之外的东西所见.显然,内核必须知道线程是如何绑定在一起的,而不是为了调度目的.

基本上,内核维护了很多线程,每个线程都有一个线程组领导,这就是在外部看到的进程.线程具有线程ID和线程组ID - 它很像PID和PPID(进程ID和父进程ID)之间的关系.

当您创建常规线程时,内核会为其提供一个全新的线程ID,但其线程组ID设置为与创建它的线程的组ID相同.这样,它看起来像是一个流程到外部世界.

当你叉,内核赋予它一个全新的线程ID和设置它的线程组ID相同的值作为其线程ID.这样,它看起来像是对外界的过程.

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

其他方法存在细微之处,这些方法可能过于复杂而无法进入.我上面写的是(希望)一篇很好的中级论文.

现在,对于您的具体问题,由于P1只有一个线程(没有P1T2),因此不会出现这种情况.

对于内核,线程是P1T1,P2T1并且P2T2假设它们具有相同的调度属性并且行为相同(a),那就是它们的调度方式.


也可以看看:

欲获得更多信息.


(a):显然,如果线程在I/O上开始阻塞(内核将不会在I/O可用之前安排它们)或者提前释放时间量(内核可能会将其优先级作为奖励以进行良好的播放),则会发生更改但后来他们表现得并不一样.


Dim*_*mos 6

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

除了接受paxdiablo的答案之外,我还添加了这个,以便添加一个关于线程调度的不同方式的一般信息视图.

通常,线程可以是用户空间线程或内核空间线程.用户空间线程通常由库实现.因此,内核几乎不了解它们(内核只知道它们所属的进程),并且它们在用户空间中处理.相反,内核线程由内核实现,它们完全由内核处理.您可以从下图中获取通用视图.

在此输入图像描述

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

内核线程的一个例子是LinuxThreads,现在已被更现代的NPTL库所取代.用户空间线程的一个例子是库GNU Portable Threads

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

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

    P1(T1),P2(T1),P1(T1),P2(T1-T1完成其任务和产量),P2(T2-剩余时间量程,P1(T1),P2(T2),P1(T1) ),....

  • 使用内核线程时,内核会调度线程.内核对线程属于哪个进程没有兴趣,但是它为每个线程平均分配一个时间量程.因此,在这种情况下,假设的调度将是:

    P1(T1),P2(T1),P2(T2),P1(T1),P2(T2),P1(T1),......


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