Linux-线程和进程调度优先级
如果我们在linux上使用默认的调度策略创建pthread(pthread_create)或进程(fork),那么调度器在调度进程和线程时会以相同的优先级处理它们吗 假设有一个进程P1有一个线程 并使用2个线程T1和T2处理P2 假设只有一个核心..调度会是 P1 T1 P1 T2 P1 T1 P1 T2 或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不再调度进程 在内核中,线程被调度。进程的概念现在是一种人工构造,主要由内核之外的事物看到。显然,内核必须知道线程是如何绑定在一起的,但不能用于
P1 T1 T2 P1 T1 T2Linux不再调度进程 在内核中,线程被调度。进程的概念现在是一种人工构造,主要由内核之外的事物看到。显然,内核必须知道线程是如何绑定在一起的,但不能用于调度目的 基本上,内核维护了大量线程,每个线程都有一个线程组负责人,这在外部被视为进程。一个线程有一个线程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),…
请注意,还有另一个类别,即,其中一些用户空间线程被转换为一个内核线程。但是,它更复杂,需要更彻底的分析