【问题标题】:mapping user-level threads to kernal将用户级线程映射到内核
【发布时间】:2019-02-06 03:35:19
【问题描述】:

是否可以将 1 用户级线程映射到 许多 内核级线程,或者例如:2 个用户级线程到 3 个或更多内核级,如果答案是是的。这如何以积极的方式改变绩效

【问题讨论】:

    标签: multithreading operating-system


    【解决方案1】:

    没有用户级线程这样的东西。那是关于操作系统的蹩脚教科书的总体BS创建。如果你有这样的书,就用它来做猫盒内衬吧。

    线程要么由操作系统实现(糟糕的教科书称之为“内核线程”),要么由运行时库模拟(用户线程)——在这种情况下,它们甚至不应该成为操作系统课程的一部分,除非历史背景。

    内核/用户线程的区别完全令人困惑。有时会因为糟糕的教科书谈论 1 对 1、多对一和多对多模型而变得更加混乱。

    你所描述的永远不会发生在教科书的范围之外。您要么使用真实线程(内核),要么在真实线程不可用时使用模拟线程(用户)。后者如今已很少见,因为您遇到的几乎所有操作系统都支持真正的线程。

    不幸的是,操作系统教科书采用了如此简单的概念并使其混乱。

    【讨论】:

    • 几乎所有教操作系统的教科书都使用这个概念(例如:操作系统内部原理和设计原则、操作系统概念)
    • 因此,即使系统无法提供 5 个“用户级”映射到 3 个“内核级”,也不存在这样的事情。这意味着您可以使用“用户级”或“内核级”,那么使用“用户级”执行它会增加 CPU 的处理时间吗?或者它根本不会影响(因为内核不能有所作为),这意味着吞吐量不会增加
    • 大多数操作系统书籍都很烂。如果可以的话,实际上你会使用真正的线程(内核)。如果不能,则恢复为模拟线程(用户)。让学生记住,您可以将 5 个“用户”线程映射到 3 个“内核”线程(您不是第一个),这表明这些书有多糟糕。
    【解决方案2】:

    是否可以将 1 个用户级线程映射到许多内核级线程,或者例如:2 个用户级线程到 3 个或更多内核级,如果答案是肯定的。这如何以积极的方式改变绩效

    理论上一切皆有可能。问题是找到这样做的理由。

    更具体地说,问题在于找到一种方法,将额外的内核线程分配给用户线程可能是有益的(而不仅仅是浪费资源)。我能想到的只有两种可能的场景,这在理论上可能是有益的。

    我将称之为“可调整宽度的 SIMD”的第一个合理场景,其中一条指令可能同时对 N 条数据进行操作,此时只分配了一个内核线程,并且一条指令(在 M 个内核线程上运行M CPU)在分配了 M 个内核线程的时候对 N*M 条数据进行操作。

    第二种可能的情况是冗余。例如,如果您将 3 个内核线程分配给一个用户线程并比较每个内核线程的操作(例如存储到内存);那么您将能够检测(并且不受其影响)某些硬件故障(例如,如果 CPU 出现故障,导致一个内核线程的行为与其他内核线程不同)。

    请注意,这两种情况都需要专门设计的硬件来满足同步要求;并且对于传统 CPU(不支持同步要求)而言,这些事情都不可能/不切实际。

    【讨论】:

    • 对于第一种情况,您不需要将工作分成多个部分(这已经是进程在制作线程时所做的事情),因此您可以从线程本身制作迷你线程以便能够映射它
    • @YounesBalah:让我们将“线程”定义为“具有自己独立指令指针的执行线程”。对于这两种情况,在用户空间中,您将有一个“执行线程”(例如,一个指令指针恰好控制 2 个或更多处理器的工作),而在内核空间中,您不会(每个处理器都会有自己独立的内核线程)。
    • 是的。请注意,要将 2 个或更多内核线程分配给一个用户线程,您必须同时运行 2 个或更多内核线程,并且唯一可能发生的方法是每个内核线程具有不同的 CPU(否则您只需有 2 个或更多内核线程在不同时间运行,并且不能同时将它们分配给同一个用户线程)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多