【发布时间】:2019-02-06 03:35:19
【问题描述】:
是否可以将 1 用户级线程映射到 许多 内核级线程,或者例如:2 个用户级线程到 3 个或更多内核级,如果答案是是的。这如何以积极的方式改变绩效
【问题讨论】:
标签: multithreading operating-system
是否可以将 1 用户级线程映射到 许多 内核级线程,或者例如:2 个用户级线程到 3 个或更多内核级,如果答案是是的。这如何以积极的方式改变绩效
【问题讨论】:
标签: multithreading operating-system
没有用户级线程这样的东西。那是关于操作系统的蹩脚教科书的总体BS创建。如果你有这样的书,就用它来做猫盒内衬吧。
线程要么由操作系统实现(糟糕的教科书称之为“内核线程”),要么由运行时库模拟(用户线程)——在这种情况下,它们甚至不应该成为操作系统课程的一部分,除非历史背景。
内核/用户线程的区别完全令人困惑。有时会因为糟糕的教科书谈论 1 对 1、多对一和多对多模型而变得更加混乱。
你所描述的永远不会发生在教科书的范围之外。您要么使用真实线程(内核),要么在真实线程不可用时使用模拟线程(用户)。后者如今已很少见,因为您遇到的几乎所有操作系统都支持真正的线程。
不幸的是,操作系统教科书采用了如此简单的概念并使其混乱。
【讨论】:
是否可以将 1 个用户级线程映射到许多内核级线程,或者例如:2 个用户级线程到 3 个或更多内核级,如果答案是肯定的。这如何以积极的方式改变绩效
理论上一切皆有可能。问题是找到这样做的理由。
更具体地说,问题在于找到一种方法,将额外的内核线程分配给用户线程可能是有益的(而不仅仅是浪费资源)。我能想到的只有两种可能的场景,这在理论上可能是有益的。
我将称之为“可调整宽度的 SIMD”的第一个合理场景,其中一条指令可能同时对 N 条数据进行操作,此时只分配了一个内核线程,并且一条指令(在 M 个内核线程上运行M CPU)在分配了 M 个内核线程的时候对 N*M 条数据进行操作。
第二种可能的情况是冗余。例如,如果您将 3 个内核线程分配给一个用户线程并比较每个内核线程的操作(例如存储到内存);那么您将能够检测(并且不受其影响)某些硬件故障(例如,如果 CPU 出现故障,导致一个内核线程的行为与其他内核线程不同)。
请注意,这两种情况都需要专门设计的硬件来满足同步要求;并且对于传统 CPU(不支持同步要求)而言,这些事情都不可能/不切实际。
【讨论】: