操作系统调度器如何调度属于两个不同进程(任务)的线程?

7
据所有的书籍所说,任务/进程之间的切换比同一任务/进程中的线程切换更昂贵。如果是这样,那么线程感知操作系统的调度程序应该安排线程以使同一进程/任务的线程相邻执行(分组),而不是与来自其他进程/任务的线程交替执行。
我正在阅读有关操作系统的书籍,所有的书都仅在陈述线程切换比进程切换便宜时就停止了。然后就没有下文了。没有一本书详细说明调度程序如何解决避免不同任务线程之间切换的问题。似乎这个问题不存在或对每个读者来说都很简单。
我的理解有误吗? 我是否漏掉了什么?为什么在“调度”章节中没有任何一本操作系统书籍涵盖可能性能下降的巨大主题?我是读错书了吗?

2
这是一个非常好的问题。我知道大多数操作系统(例如Linux)将线程视为进程,并不进行任何特殊优化。我会继续寻找答案,因为我自己也很好奇... - Dougvj
1
我发现了关于团队调度和协同调度的文章,这涉及将相关线程分组在一起。这很有趣,但并没有为提供答案增加太多帮助。不过,似乎进程切换的开销很低,因此将线程简单地安排为进程不会对性能造成不利影响。 - Dougvj
@Dougvj: (2011) 操作系统-内部和设计原理,第7版(ISBN 013230998X),第439页。最后我找到了他们用于将同一任务/进程的线程分组执行的术语。 - kachanov
这个主题与我的问题非常相关:操作系统在多大程度上努力减少TLB清除?:https://dev59.com/lkjSa4cB1Zd3GeqPHKZ5 - kachanov
人们太过于着迷于关闭问题 - uh_big_mike_boi
1个回答

1

在我看来,这将是一种危险的优化,因为如果调度程序基于进程内存页面是否已经加载而偏爱线程,会发生两件事:

  1. 新进程将被饿死。
  2. 它将允许一个进程不断生成线程以保持在CPU上。

调度程序的主要优先事项是:

  1. I/O响应性 - 即I/O绑定线程抢占CPU绑定线程。
  2. 公平性 - 尽量确保饥饿现象受到限制。
  3. 低延迟 - 确保每个进程可以在合理的时间内完成。

很容易看出这三个条件与上述优化相冲突。


看起来线程上下文切换和任务上下文切换之间的差异是如此微小,以至于没有操作系统调度程序会费心让兄弟线程彼此紧挨着运行。似乎线程/进程的其他属性具有更高的优先级。 - kachanov
@kachanov:是的,用于调度的主要标准是线程的静态和动态优先级。 - Tudor
请纠正我如果我错了:如果在执行队列中的下一个线程恰好是来自同一进程(某种方式,线程应该使用一些标志或描述符让调度程序知道),那么调度程序就会更少地干扰并仅切换线程上下文。如果下一个线程来自另一个进程,调度程序就不会关心,只需多做一点工作即可切换进程上下文。我的理解正确吗? - kachanov
@kachanov:是的,这是正确的,因为同一进程的线程共享内存空间,因此共享该进程的已加载内存页。 - Tudor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接