【问题标题】:one-to-one multi-threading model一对一多线程模型
【发布时间】:2018-08-13 21:57:46
【问题描述】:

在 silberschatz“操作系统概念”一书中,第 4.3.2 节说

一对一模型比多对一模型提供更多并发性 当一个线程阻塞时允许另一个线程运行 系统调用。它还允许多个线程并行运行 多处理器。

我有两个问题:

  1. 如何阻止一个线程而将其他线程映射到内核线程? 难道我们不知道如果一个线程被阻塞,整个过程 用户级线程被阻塞?
  2. 操作系统考虑用户级线程 仅作为一个线程。不能分配给多个 处理器/内核。是不是下面给定的行与此相矛盾 主意?

    它还允许多个线程并行运行 多处理器

【问题讨论】:

  • 不,不是。我在一对一地询问模型。多对一模型实际上确实阻塞了,我知道这一点。我要问两个问题,以阐明您提到的问题。所以没有必要贸然下结论。
  • “多对一”和“用户级线程”大致是同义词。 “一对一模型”也称为“内核级线程”,它没有多对一/用户级线程方式的限制。
  • 感谢您的澄清。从这个意义上说,是的,这可能是重复的。

标签: multithreading operating-system


【解决方案1】:

您对用户级线程和内核级线程的理解是不正确的,特别是您需要了解用户级线程如何映射到内核级线程。所以首先让我们定义一些术语

内核线程

由内核创建和管理的线程(可调度任务)。每个内核级线程都由一些数据结构表示,其中包含与线程相关的信息。对于 Linux,它是 task_struct。内核线程是 CPU 调度程序考虑进行调度的唯一线程。

注意:内核线程有点用词不当,因为 Linux 内核不区分线程和进程,可调度任务更好地描述了这个实体

用户线程

由内核级别以上的 JVM 等库创建和管理的线程。创建这些线程的库负责对其进行管理,即运行哪个线程以及何时运行。

用户级别到内核级别的映射

现在您可以创建任意数量的用户级线程,但要执行它们,您需要创建一些内核级线程 (task_struct)。这种内核级线程的创建可以通过多种方式完成

一对一模型

在这种情况下,每当您创建用户级线程时,您的库都会要求内核创建一个新的内核级线程。在 Linux 的情况下,您的库将使用克隆系统调用来创建内核级线程。

多对一模型

在这种情况下,您的库只创建一个内核级线程 (task_struct)。无论您创建多少个用户级线程,它们都共享同一个内核级线程,就像在单核 CPU 上运行的进程一样。要理解的一点是,您的库在这里的行为很像 CPU 调度程序,它在单个内核级线程上调度许多用户级线程。

现在回答您的问题

操作系统仅将用户级线程视为一个线程。不可能 分配给多个处理器/内核。是不是下面给定的行 与这个想法相矛盾?

如果您使用多对一模型,在这种情况下,您将只有一个内核级线程用于所有用户级线程,因此它们无法在不同的 CPU 上运行。

但是,如果您使用的是一对一模型,那么您的每个用户级线程都有一个相应的内核级线程,可以单独调度,因此如果您有多个 CPU,用户级线程可以在不同的 CPU 上运行。

【讨论】:

  • 感谢您的澄清。只是一个问题,task_struck是linux中的PCB吗?还是特定于线程?我记得 task_struck 有关于进程的所有信息。线程相关信息是整个task_struck的子集吗?
  • @freshlearner Linux 不区分进程和线程。当你使用 clone 系统调用创建一个新任务时,你可以使用一些标志来指定这个新任务将与它的父任务共享哪些数据结构。如果您指定这些标志以使父子之间不发生共享,那么您实际上已经创建了一个新进程。另一方面,如果您为可能的最高共享指定这些标志,则新任务实际上是一个线程。
【解决方案2】:

你正被一本令人困惑的书所困扰。

有真实线程(又名内核线程,1 对 1 模型)和模拟线程(又名用户线程,多对 1 模型)。

有些书通过抛出一个假设的多对多模型使这一点更加混乱。

用户线程已过时。如今,任何值得一读的操作系统书籍都会以这种方式对待它们并用历史术语来描述它们。

如何阻塞一个线程而另一个线程映射到内核线程?难道我们不知道如果一个线程被阻塞,则该用户级线程的整个进程都会被阻塞?

你要么有用户线程,要么有内核线程。两者兼得的应用程序将被彻底搞砸。

操作系统仅将用户级线程视为一个线程。它不能分配给多个处理器/内核。下面给出的行不是与这个想法相矛盾吗?

在过去,一个进程被认为是一个执行流和一个地址空间。没有线程。当线程变得必要时(主要是由于需要 Ada 支持),它们使用计时器进行模拟。线程的行为因操作系统而异。

在 Eunuchs 变体中,阻塞调用会完全阻塞进程。因此,在模拟(用户)线程中,一个线程中的阻塞调用将阻塞所有线程。并非所有操作系统都如此。

现在,一个进程是一个或多个执行流和一个地址空间。那是你应该学习的;不是一堆技术废话。

一本以 1 对 1 或多对 1 模型讨论线程的书只适合线猫盒子。

【讨论】:

  • 更有意义。我不明白为什么这些天有些书总是给出模糊的参考而不是谈论真正的交易。
  • 他们把简单的事情变得复杂起来。用户线程是在操作系统支持线程之前实现线程的权宜之计。仍然有一些操作系统不支持线程,但这些都是异常值。因为“用户线程”是作为库实现的,所以甚至不需要在操作系统课程中介绍它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2014-11-09
  • 1970-01-01
  • 2019-09-15
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多