在 Linux 调度器中,包含多个线程的不同进程如何获得公平的时间配额?

Posted

技术标签:

【中文标题】在 Linux 调度器中,包含多个线程的不同进程如何获得公平的时间配额?【英文标题】:In Linux scheduler, how do different processes containing multiple threads get fair time quota? 【发布时间】:2014-01-16 02:28:58 【问题描述】:

我知道 linux 调度程序会调度 task_struct 这是一个线程。那么如果我们有两个进程,比如A有100个线程,B是单线程,那么如何公平调度这两个进程,考虑每个线程是否公平调度?

另外,所以在Linux中,来自同一进程的线程之间的上下文切换会比来自不同进程的线程之间的上下文切换要快,对吧?因为后者将与进程控制块有关,而前者则不会。

【问题讨论】:

考虑查看文档,kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt 它对 CFS 的工作方式有非常清晰的描述。 @rakib 感谢您的回复。但是我没有在页面中看到任何可以回答我的问题的内容:( 好的,看看我的回答,希望对你有帮助。 Would process with more threads on linux have more cpu time than process with one thread?的可能重复 第二部分:来自同一进程的线程之间的上下文切换会比来自不同进程的线程之间的上下文切换更快应该是一个单独的问题。 【参考方案1】:

您在这里缺少的一点是调度程序如何看待线程或任务。好吧,Linux 内核调度器会将它们视为单独的调度实体,因此会以不同的方式计算和调度。

现在让我们看看 CFS 文档是怎么说的 - 它有一种简单的方法,即为每个可运行进程分配均匀的 CPU 时间,因此,如果有 4 个可运行的进程/线程,它们将分别获得 25% 的 CPU 时间。但是在真正的硬件上这是不可能的,并且引入了 vruntime 来解决这个问题(从here获取更多信息

现在回到你的例子,如果进程 A 创建 100 个线程,B 创建 1 个线程,那么正在运行的进程或线程的数量变为 103(假设所有都是可运行状态)然后 CFS 将使用公式 1/103 平均共享 cpu (cpu/正在运行的任务数)。并且所有调度实体的上下文切换都是相同的,线程只共享任务的内部 mm_struct 并且当它们运行时它们有自己的寄存器集,要加载的任务状态开始。希望这将有助于更好地理解。

【讨论】:

@rabik 所以你的意思是 A 和 B 不会因为 A 有更多线程而受到公平对待?我不确定。但这看起来不公平,因为 B 会饿死 A。 我说,线程或进程什么的,调度器不会将它们分开处理,因此它们是相同的。如果它们相同,现在对其应用 CFS 公式并思考,一切都会清楚。

以上是关于在 Linux 调度器中,包含多个线程的不同进程如何获得公平的时间配额?的主要内容,如果未能解决你的问题,请参考以下文章

有多个套接字时Linux OS如何调度线程

Linux 进程管理之进程调度与切换

Linux学习笔记—— Linux进程概念

24多线程

进程线程及其状态

Linux线程 | 创建 终止 回收 分离