【问题标题】:Differences between Multi-threading Models多线程模型之间的差异
【发布时间】:2016-12-03 12:14:35
【问题描述】:
  1. 多对一模型
  2. 一对一模型
  3. 多对多模型

每个模型的优缺点?

你能举个例子吗?

EDIT:

有一件事让我对多对一模型感到困惑 我在引用这本书:

"线程管理是由用户空间的线程库完成的,所以它 是有效率的;但是如果一个线程产生一个 阻塞系统调用。另外,因为只有一个线程可以访问 内核一次,多个线程无法并行运行 多处理器”

这是否意味着内核中的所有进程都将被阻塞,因为交换是由应用程序完成的,而不是由操作系统调度程序完成的。 (因为在这个模型中,我们在用户模式下管理线程)? 或者,只有属于进行阻塞系统调用的线程的同一进程的线程才会被阻塞?

提前致谢!

【问题讨论】:

    标签: multithreading linux-kernel operating-system kernel


    【解决方案1】:

    我们必须将用户级线程分配给内核级线程,基于此映射可以是:

    1. 一对一(一个用户线程映射到一个内核级线程)

    2. 多对一(许多用户级线程映射到一个内核级线程)

    3. 多对多(许多用户级线程映射到许多内核级线程)

    这里内核级线程的数量通常设置为少于用户级线程的数量,因为内核级线程的管理成本要高得多,因为它涉及内核对其(内核级线程的)管理的干预。

    由于这个原因,只有 “一对多”(一个用户级线程到多个内核级线程)到一个的第四个映射没有意义。

    "线程管理由用户空间的线程库完成,效率高;但是如果一个线程进行阻塞系统调用,整个进程就会阻塞。另外,因为只有一个线程可以访问内核一次,多个线程无法在多处理器上并行运行”

    这个例子可能有助于理解这一行:

    这是否意味着内核中的所有进程都将被阻塞,因为交换是由应用程序完成的,而不是由操作系统调度程序完成的。 (因为在这个模型中,我们在用户模式下管理线程)?或者,只有属于进行阻塞系统调用的线程的同一进程的线程才会被阻塞?

    一个进程的线程独立于其他进程的线程。因此只有属于进行阻塞系统调用的线程的同一进程的线程才会被阻塞。

    我希望这对你有意义......

    【讨论】:

    • 嗨@Rupsingh 我不明白一件事。根据您添加的图像,当一个线程进行阻塞系统调用时,进程本身会被阻塞,因为内核将不知道其他线程的存在。你能解释一下为什么内核不知道进程的其他线程吗?
    【解决方案2】:

    我可以看到你的问题。你有一本可怕的书。

    您问的是几个相关的问题。首先,线程的实现一般有两种方式。

    1) 线程在库中使用定时器实现。在调度进程执行的系统中,这是执行线程的唯一方法。这是在过去做线程的唯一方法。这个系统通常被称为“用户线程”。用户线程在一个进程中被多路复用。进程自己调度线程。

    “用户线程”优于“内核线程”(如下)的神话般的优势在于它们更高效。这就是您引用的段落所指的内容。 “如果线程进行阻塞系统调用,整个进程将阻塞”这句话仅在某些 [unix] 系统上是正确的。

    2) 线程在操作系统中实现。一个进程由一个地址空间和一个或多个线程组成。操作系统内核调度线程执行而不是进程。这些是内核线程。

    请注意,即使系统支持内核线程,进程也有可能使用用户线程。两者并不相互排斥。但是,原生不支持内核线程的系统只能使用用户线程。

    这是解释不同线程模型的简单方法。

    -=-=-=-=-=-=-=-=-=-=-=-

    一对一、多对一和多对多模型对学生来说是不必要的混淆。现在我们必须进入重叠的术语。

    让我们改变一下术语。对于#1,我们将其称为“内核线程”,而不是将可调度的执行单元称为“进程”。在此模型中,每个进程只能有一个内核线程。那么进程中的线程就是“用户线程”。任意数量的用户线程在内核线程内执行/映射到内核线程。这就是多对一模型。用户线程 = 多对一。

    如果我们让操作系统创建线程(内核线程),那么理论上我们将正在执行的内容称为“用户线程”。每个用户线程都映射到/在一个且只有一个内核线程中执行。这就是一对一的模型。

    多对一模型与通常所说的“用户线程模型”相同。

    术语开始变得荒谬,因为只有一个线程,但我们称它为映射到内核线程的用户线程。

    一对一模型就是通常所说的内核线程模型。

    最后,我们进入多对多模型。这是理论上的BS。理论上,可能有许多用户线程映射到许多内核线程。换句话说,单个用户线程可以在不同的内核线程中执行。我从未听说过以这种方式实现线程的系统,而且我无法想象这样的系统有什么实际优势。

    -=-=-=-=-=-=-=-=-=-=-=-=-=-

    关于您的最后一个问题,在某些操作系统中,阻塞系统调用阻塞也会阻塞用于实现用户线程的计时器(a/k/a 多对一)。如果一个线程进行阻塞调用,它会阻止进程中的所有其他线程执行,直到阻塞调用完成。

    这种阻塞不会发生在所有系统中(操作系统教科书应该指出这一点)。

    【讨论】:

    • 谢谢,帮了大忙。我正在使用的书是——《操作系统概念,第九版》。
    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多