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

标签 multithreading operating-system scheduling multitasking

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .




9年前关闭。




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

当我阅读有关操作系统的书籍时,所有书籍都只是说线程切换比进程切换便宜。就是这样。没有书告诉调度器如何准确地解决避免在不同任务的线程之间切换的问题。好像这样的问题不存在,或者对每个读者来说都是微不足道的。

我对问题的理解不正确吗?还是我错过了什么?为什么"dispatch"一章的每一本操作系统书籍都没有涵盖如此巨大的性能下降主题?我读错书了吗?

最佳答案

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

  • 较新的进程将被饿死。
  • 它将允许进程继续生成线程以留在 CPU 上。

  • 调度程序的主要优先级是:
  • I/O 响应能力 - 即 I/O 绑定(bind)线程抢占 CPU 绑定(bind)线程。
  • 公平——尽量确保饥饿是有限的。
  • 低延迟 - 确保每个进程都可以在合理的时间内完成。

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

    关于multithreading - 操作系统调度程序如何调度属于两个不同进程(任务)的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10846181/

    相关文章:

    c - RTOS 上下文中的 "handskake"是什么?

    c - *尼克斯读()/写(): Are they re-entrant?

    javascript - 跨操作系统平台的路径分隔符

    algorithm - 变体调度算法

    linux - 如何增加新生成进程的 CPU 频率

    c# - Thread.Yield 是否会让 CPU 进行上下文切换到同一进程或同一处理器中的其他线程?

    java - 等待所有任务完成

    java - 单例中的双重检查锁定

    Java点对点线程模型,大家等待Job