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

Linux-线程和进程调度优先级,linux,process,pthreads,scheduling,Linux,Process,Pthreads,Scheduling,如果我们在linux上使用默认的调度策略创建pthread(pthread_create)或进程(fork),那么调度器在调度进程和线程时会以相同的优先级处理它们吗 假设有一个进程P1有一个线程 并使用2个线程T1和T2处理P2 假设只有一个核心..调度会是 P1 T1 P1 T2 P1 T1 P1 T2 或 P1 T1 T2 P1 T1 T2Linux不再调度进程 在内核中,线程被调度。进程的概念现在是一种人工构造,主要由内核之外的事物看到。显然,内核必须知道线程是如何绑定在一起的,但不能用于

如果我们在linux上使用默认的调度策略创建pthread(pthread_create)或进程(fork),那么调度器在调度进程和线程时会以相同的优先级处理它们吗

假设有一个进程P1有一个线程 并使用2个线程T1和T2处理P2

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


P1 T1 T2 P1 T1 T2

Linux不再调度进程

在内核中,线程被调度。进程的概念现在是一种人工构造,主要由内核之外的事物看到。显然,内核必须知道线程是如何绑定在一起的,但不能用于调度目的

基本上,内核维护了大量线程,每个线程都有一个线程组负责人,这在外部被视为进程。一个线程有一个线程ID和一个线程组ID——这很像PID和PPID(进程ID和父进程ID)之间的关系

创建常规线程时,内核会给它一个全新的线程ID,但其线程组ID设置为与创建它的线程的组ID相同。这样,对于外部世界来说,它就像进程中的线程

当您使用fork时,内核会给它一个全新的线程ID,并将其线程组ID设置为与其线程ID相同的值。这样,在外界看来,它就像一个进程

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

其他方法也有一些微妙之处,可能过于复杂,无法在这里讨论。我上面写的(希望)是一篇很好的中级论文

现在,对于您的特定问题,这两种情况都不是,因为
P1
只有一个线程(没有
P1T2

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


另见:

  • )
  • );及
了解更多信息



(a) :很明显,如果线程开始阻塞I/O(内核在I/O可用之前不会对其进行调度)或提前释放其时间量(内核可能会提高其优先级以奖励玩得好),那么这些线程的行为就会发生变化。Linux内核(从版本和版本)确实会调度任务,是线程或(单线程)进程

除了paxdiablo的公认答案之外,我添加这个是为了添加一个关于线程调度不同方式的通用信息视图

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

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

内核线程的一个例子是,现在已经被更现代的线程所取代。用户空间线程的一个示例是库

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

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

    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),…


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