Multithreading 多线程模型之间的差异 多对一模型 一对一模式 多对多模型

Multithreading 多线程模型之间的差异 多对一模型 一对一模式 多对多模型,multithreading,linux-kernel,operating-system,kernel,Multithreading,Linux Kernel,Operating System,Kernel,每种模式的优点和缺点 你能举个例子吗 EDIT: 有一件事把我和多对一模型搞混了 我引用这本书: “线程管理由用户空间中的线程库完成,因此 是有效的;但是如果线程执行 阻止系统调用。另外,因为只有一个线程可以访问 一次使用内核时,多个线程无法在上并行运行 “多处理器” 这是否意味着内核中的所有进程都将被阻止,因为交换是由应用程序完成的,而不是由OS调度器完成的。 (因为在此模型中,我们以用户模式管理线程)? 或者,只有属于进行阻塞系统调用的线程的同一进程的线程才会被阻塞 提前谢谢 我能看出你的

每种模式的优点和缺点

你能举个例子吗

EDIT:
有一件事把我和多对一模型搞混了 我引用这本书:

“线程管理由用户空间中的线程库完成,因此 是有效的;但是如果线程执行 阻止系统调用。另外,因为只有一个线程可以访问 一次使用内核时,多个线程无法在上并行运行 “多处理器”

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


提前谢谢

我能看出你的问题。你有一本可怕的书

你在问一些相关的问题。首先,有两种实现线程的通用方法

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

“用户线程”相对于“内核线程”(见下文)的神秘优势在于它们更高效。这就是你引用的文章所指的。只有在某些[unix]系统上,语句“如果线程进行阻塞系统调用,则整个进程将阻塞”

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

请注意,即使系统支持内核线程,进程也可以使用用户线程。这两者并不相互排斥。然而,本机不支持内核线程的系统只能使用用户线程

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

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

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

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

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

多对一模型与通常称为“用户线程模型”的模型相同

这个术语开始变得毫无意义,因为只有一个线程,但我们称它为映射到内核线程的用户线程

一对一模型通常被称为内核线程模型

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

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

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


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

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

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

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

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

  • 在这里,内核级线程的数量通常设置为小于用户级线程的数量,因为内核级线程的管理要昂贵得多,因为它涉及到内核干预(内核级线程的)管理

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

    “线程管理由用户空间中的线程库完成,因此非常有效;但如果线程进行阻塞系统调用,整个进程将被阻塞。此外,由于一次只能有一个线程访问内核,因此多个线程无法在多处理器上并行运行”

    此示例可能有助于理解这一行:

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

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

    我希望这对您有意义…

    谢谢您的帮助