2012-06-01 19 views
4

就所有书籍而言,在任务/进程之间切换比在同一进程/任务的线程之间切换要昂贵。如果是这样,那么线程感知操作系统的调度程序应该以这样的方式调度线程,即相同进程/任务的线程应该彼此相邻(分组)执行,并且不与来自其他进程/任务的线程交织。OS调度程序如何调度属于两个不同进程(任务)的线程?

正如我读的书操作系统,所有的书只停留在指出线程切换比进程切换更便宜。就是这样。没有一本书讲述了调度程序如何解决避免在不同任务的线程之间切换的问题。就好像这样的问题对每个读者都不存在或者微不足道。

我对这个问题的理解不正确吗?或者我错过了什么?为什么如此巨大的可能性能降低话题在“调度”一章的每一本操作系统手册中都没有涉及到?我在读错书吗?

+1

这是一个非常好的问题。我知道大多数操作系统(例如Linux)将线程视为进程,不做任何特殊的优化。我会继续寻找答案,因为我很好奇自己... – Dougvj

+1

我找到了关于将相关线程组合在一起的帮派调度和调度的文章。这很有趣,但并不能提供和回答。但是,似乎很可能,进程切换具有足够低的开销,以至于将线程调度为进程并不会损害性能。 – Dougvj

+0

@Dougvj:(2011)Operating Systems - Internals and Design Principles,7th Ed(ISBN 013230998X),page 439.最后,我发现他们用于分组执行相同任务/进程的线程 – kachanov

回答

1

在我看来,这将是一个危险的优化,因为如果基于进程的内存页面是否已经装载两件事情会发生的调度青睐线程:

  1. 更新的过程会被饿死。
  2. 这将允许一个进程保持产卵线程为了留在CPU上。

调度器的主要重点是:

  1. I/O响应性 - 即I/O绑定线程抢占CPU限制的线程。公平 - 努力确保饥饿是有限的。
  2. 低延迟 - 确保每个过程都能在合理的时间内完成。

这是很容易地看到,所提到的这些优化的3个条件的冲突。

+0

看起来像线程上下文切换或任务上下文切换之间的区别非常小,以至于操作系统调度程序甚至无法关于彼此相邻运行的兄弟线程。似乎线程/进程的其他属性具有更高的优先级 – kachanov

+0

@kachanov:是的,用于调度的主要标准是线程的静态和动态优先级。 – Tudor

+0

纠正我,如果我错了:如果通过任何机会或算法执行队列中的下一个线程似乎来自相同的进程(不知何故线程应该让调度器使用一些标志或描述符知道),调度程序只是麻烦减少并切换线程上下文。如果下一个线程来自另一个进程,调度程序不关心,只是通过切换进程上下文来做更多的工作。我的理解是否正确? – kachanov