首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一对一多线程模型

一对一多线程模型
EN

Stack Overflow用户
提问于 2018-03-06 05:46:11
回答 2查看 5.6K关注 0票数 7

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

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

我有两个问题:

  1. 如何阻止一个线程而在内核线程上映射另一个线程?难道我们不知道如果一个线程被阻塞,用户级线程的整个进程就会被阻塞吗?
  2. 操作系统只将用户级线程视为一个线程。它不能分配给多个处理器/核。下面这句话不是与这个观点相矛盾吗?它还允许多个线程在多处理器上并行运行。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 07:04:22

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

内核线程

由内核创建和管理的线程(可调度任务)。每个内核级线程都由包含与线程相关的信息的某种数据结构表示。在Linux的例子中,它是task_struct。内核线程是CPU调度程序为调度所考虑的唯一线程。

注意:由于Linux内核没有区分线程和进程,所以entity.内核内核有点用词不当,可调度的任务可以更好地描述这个

用户线程

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

用户级到内核级映射

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

一对一模式

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

多对一模式

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

现在来问你的问题

操作系统只将用户级线程视为一个线程。它不能分配给多个处理器/核心。下面这句话不是与这个观点相矛盾吗?

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

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

票数 10
EN

Stack Overflow用户

发布于 2018-03-06 18:18:25

你在受一本令人困惑的书的折磨。

有真正的线程(也就是内核线程,1到1模型)和模拟线程(也就是用户线程,多到1个模型)。

有些书通过向许多模型扔一个假想的许多,使这更令人困惑。

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

如何阻止一个线程而在内核线程上映射另一个线程?难道我们不知道如果一个线程被阻塞,用户级线程的整个进程就会被阻塞吗?

您要么有用户线程,要么有内核线程。这样做的应用程序将被严重地搞砸。

操作系统只将用户级线程视为一个线程。它不能分配给多个处理器/核。下面这句话不是与这个观点相矛盾吗?

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

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

现在,进程是一个或多个执行流和地址空间。这是你应该学习的,而不是一群技术官僚。

一本用1到1或多对1模型来讨论线程的书,只适合线猫盒。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49124129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档