在silberschatz“操作系统概念”一书中,4.3.2节指出
一对一模型提供了比多对一模型更多的并发性,在线程执行阻塞系统调用时允许另一个线程运行。它还允许多个线程在多处理器上并行运行。
我有两个问题:
发布于 2018-03-06 07:04:22
您对用户级线程和内核级线程的理解是不正确的,特别是您需要了解用户级线程是如何映射到内核级线程的。所以首先让我们来定义一些术语
内核线程
由内核创建和管理的线程(可调度任务)。每个内核级线程都由包含与线程相关的信息的某种数据结构表示。在Linux的例子中,它是task_struct。内核线程是CPU调度程序为调度所考虑的唯一线程。
注意:由于Linux内核没有区分线程和进程,所以entity.内核内核有点用词不当,可调度的任务可以更好地描述这个
用户线程
由内核级别上的JVM等库创建和管理的线程。创建这些线程的库负责它们的管理,即哪个线程运行和何时运行。
用户级到内核级映射
现在,您可以创建任意数量的用户级线程,但是要执行这些线程,您需要创建一些内核级线程(task_struct)。内核级线程的创建可以通过多种方式完成。
一对一模式
在这种情况下,无论何时创建用户级线程,库都会要求内核创建一个新的内核级线程。在Linux的情况下,库将使用克隆系统调用来创建内核级线程。
多对一模式
在这种情况下,库只创建一个内核级线程(task_struct)。不管您创建了多少用户级线程,它们都共享同一个内核级线程,就像运行在单个核心CPU上的进程一样。需要理解的一点是,这里的库非常像CPU调度程序,它在单个内核级线程上调度多个用户级线程。
现在来问你的问题
操作系统只将用户级线程视为一个线程。它不能分配给多个处理器/核心。下面这句话不是与这个观点相矛盾吗?
如果您使用的是多到一个模型,在这种情况下,对于所有用户级别的线程,您将只有一个内核级线程,因此它们不能在不同的CPU上运行。
但是,如果您使用的是一对一的模型,那么每个用户级线程都有一个相应的内核级线程,可以单独调度,因此用户级线程可以在不同的CPU上运行,因为您有多个CPU。
发布于 2018-03-06 18:18:25
你在受一本令人困惑的书的折磨。
有真正的线程(也就是内核线程,1到1模型)和模拟线程(也就是用户线程,多到1个模型)。
有些书通过向许多模型扔一个假想的许多,使这更令人困惑。
用户线程已经过时。如今,任何值得一读的操作系统书籍都会以这样的方式对待它们,并用历史术语来描述它们。
如何阻止一个线程而在内核线程上映射另一个线程?难道我们不知道如果一个线程被阻塞,用户级线程的整个进程就会被阻塞吗?
您要么有用户线程,要么有内核线程。这样做的应用程序将被严重地搞砸。
操作系统只将用户级线程视为一个线程。它不能分配给多个处理器/核。下面这句话不是与这个观点相矛盾吗?
在ye时代,进程被认为是一个执行流和一个地址空间。没有任何线索。当线程变得必要时(主要是因为需要Ada支持),就会使用计时器来模拟它们。线程的行为因操作系统而异。
在Eunuchs变体中,阻塞调用完全阻塞了流程。因此,在模拟(用户)线程中,一个线程中的阻塞调用将阻塞所有线程。并不是所有的操作系统都是如此。
现在,进程是一个或多个执行流和地址空间。这是你应该学习的,而不是一群技术官僚。
一本用1到1或多对1模型来讨论线程的书,只适合线猫盒。
https://stackoverflow.com/questions/49124129
复制相似问题