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

在Linux调度程序中,包含多个线程的不同进程如何获得公平时间配额?,linux,multithreading,process,task,schedule,Linux,Multithreading,Process,Task,Schedule,我知道linux调度程序将调度任务结构,它是一个线程。那么,如果我们有两个进程,例如,A包含100个线程,而B是单线程,那么考虑到每个线程的调度是否公平,如何公平地调度这两个进程 另外,在Linux中,来自同一进程的线程之间的上下文切换要比来自不同进程的线程之间的上下文切换快,对吗?因为后者与进程控制块有关,而前者与进程控制块无关。这里缺少的一点是调度器如何看待线程或任务。Linux内核调度器将它们视为单独的调度实体,因此将以不同的方式进行计数和调度 现在,让我们看看CFS文档是怎么说的——它有

我知道linux调度程序将调度任务结构,它是一个线程。那么,如果我们有两个进程,例如,A包含100个线程,而B是单线程,那么考虑到每个线程的调度是否公平,如何公平地调度这两个进程


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

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

现在,让我们看看CFS文档是怎么说的——它有一种简单化的方法,为每个可运行的进程分配甚至一部分CPU时间,因此,如果有4个可运行的进程/线程,它们将获得25%的CPU时间。但在真正的硬件上,这是不可能的,要解决这个问题,vruntime被引入(请从


现在回到您的示例,如果进程A创建100个线程,而进程B创建1个线程,则运行进程或线程的数量变为103(假设所有进程或线程都处于可运行状态),那么CFS将使用公式1/103(cpu/运行任务数)平均共享cpu。而上下文切换对于所有调度实体都是一样的,线程只共享任务的内部mm_结构,当它们运行时,它们有自己的寄存器集,要加载的任务状态。希望这有助于更好地理解。

考虑查看文档,它对CFS的工作原理有非常清晰的描述。@rakib谢谢您的回复。但是我在页面中没有看到任何可以回答我问题的内容:(好的,请看我的答案,希望能有所帮助。第二部分的可能重复:来自同一进程的线程之间的上下文切换将比来自不同进程的线程之间的上下文切换快。这应该是一个单独的问题。@rabik,你是说a和B不会因为a有更多线程而得到公平对待?我不确定。但这看起来不是正如B将饿死A一样公平。我说过,线程或进程,无论什么,调度程序都不会单独处理它们,因此它们是相同的。如果它们是相同的,现在在其上应用CFS公式并思考,一切都会变得清晰。