Linux内核确实如此(来自版本 2.6.23 和on)调度任务,它们是线程或(单线程)进程。
除了接受paxdiablo的答案之外,我还添加了这个,以便添加一个关于线程调度的不同方式的更一般的信息视图。
一般来说, 的 线程可以是用户空间线程或内核空间线程 强> 。用户空间线程通常由库实现。因此,内核几乎不了解它们(内核只知道它们所属的进程),并且它们在用户空间中处理。相反,内核线程由内核实现,它们完全由内核处理。您可以从下图中获取通用视图。
如您所见,左图显示了一些用户空间线程,其中内核只拥有有关进程的信息(所谓的 过程控制块 - PCB )。所有关于线程的资源信息都保存在进程内(在线程表中),并由用户空间中的相应线程库处理。在右图中,您可以看到内核线程,其中进程表和线程表都保存在内核中。
内核线程的一个例子是 Linux线程 ,现在已经被更现代的所取代 NPTL库 。用户空间线程的一个例子是库 GNU移动线程
现在,就调度而言,正如预期的那样,用户空间线程以与内核线程不同的方式进行调度:
使用用户空间线程时,调度程序正在调度进程。因此,它选择一个特定的进程并分配允许的时间量。然后,进程内的线程调度程序负责选择如何在线程之间进行调度。由于用户空间线程不会被中断停止,因此所选线程将倾向于消耗整个过程量,直到完成其任务为止。因此,在这种情况下的假设调度将是这样的:
的 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),...... 强>
请注意,还有另一个类别, 的 混合线程 强> ,其中一些用户空间线程被转换为一个内核线程。但是,它更复杂,需要更彻底的分析。
Linux根本不再安排进程。
在内核中, 线程 预定。过程的概念现在是一个人工构造,主要由内核之外的东西所见。显然,内核必须知道线程是如何绑在一起的,但是 不 用于安排目的。
基本上,内核维护了很多线程,每个线程都有一个线程组组长,这就是在进程外部看到的。线程具有线程ID和线程组ID - 它很像PID和PPID(进程ID和父进程ID)之间的关系。
当你创建一个常规 线, 内核为它提供了一个全新的线程ID,但其线程组ID设置与创建它的线程的组ID相同。这样,它看起来像是一个流程到外部世界。
当你 叉子, 内核为它提供了一个全新的线程ID,并将其线程组ID设置为与其线程ID相同的值。这样,它看起来像是对外界的过程。
报告进程的大多数非内核实用程序实际上只是报告线程ID与线程组ID相同的线程。
其他方法存在细微之处,这些方法可能过于复杂而无法进入。我上面写的是(希望)一篇很好的中级论文。
现在,对于你的具体问题,从那以后就不会这样了 P1 只有一个线程(没有 P1T2 )。
P1
P1T2
有了内核,线程就是 P1T1 , P2T1 和 P2T2 并且,假设它们具有相同的调度属性并且表现相同 (一个) ,这就是他们如何安排。
P1T1
P2T1
P2T2
也可以看看:
欲获得更多信息。
(一个) :显然,如果线程在I / O上开始阻塞(内核不会在I / O可用之前调度它们)或者提前释放时间量(内核可能会将其优先级作为奖励以便很好地播放),则会发生变化'表现不一样。