在过去的几个月里,我一直在学习操作系统课程。不过,我想对我读到的一点加以澄清。据我所知,有三种类型的多线程模型可以将用户级线程映射到内核级线程-
我明白为什么多到一个模型在并行处理方面效率不高--因为阻塞系统调用意味着停止任何处理。
然而,在我提到的“操作系统概念”(由亚伯拉罕·西尔伯沙茨、格雷格·加涅和彼得·加尔文撰写)一书中,它说Linux和Windows家族都使用一对一模型,尽管为创建的每个用户线程创建内核线程需要额外的开销。
多到多的模特不是更好吗?因为您有许多内核线程,足以具有高度的并行性,而且您始终可以选择两个级别的模型来将用户级线程绑定到内核级别的线程。
TLDR:为什么在Windows和Linux系统中,一对一多线程模型比许多多线程模型更受欢迎?
发布于 2016-11-21 04:14:59
多到多的模特不是更好吗?
我建议再买一本书。AFAIK多对多模型完全是理论性的(如果有人知道使用它的系统,请在评论中注明)。这些模型是解释线程的一个非常糟糕的方法。
在过去的日子里,操作系统没有线程的概念。他们排定了执行过程。事实上,对于许多操作系统来说,情况仍然是这样。
对线程的需求主要是由需要“任务”支持的Ada编程语言驱动的。为了有一个兼容的Ada实现,必须有一个库来模拟单个进程中的线程。在这样的系统中,进程调度自己的线程执行(“用户线程”),这有一个缺点,即线程总是交错运行(在不同的处理器上从不并行)。
这被称为“多对一”,但这是对正在发生的事情的拙劣描述。您的模型将“许多用户线程”映射到单个“内核线程”。实际上,没有内核线程。相反,线程是在进程上下文中实现的。
操作系统通常将进程视为具有多个可调度执行线程的地址空间。在这样的系统中,线程是调度的基本单位,而不是进程。是你计划中的一对一模式。
它说,Linux和Windows家族都使用一对一模型,尽管为创建的每个用户线程创建内核线程需要额外的开销。
这是一种BS.There开销,无论线程是如何实现的。你经常会发现有人声称“多对一”比“一对一”更有效。这一说法似乎只是都市传说。
为什么在Windows和Linux系统中,一对一多线程模型比许多多线程模型更受欢迎?
“一对一”(也称为内核线程)模型更可取,因为它利用了多个处理器并允许实际并行执行。它还避免了一些系统(如Eunuchs)中可能出现的阻塞问题。
发布于 2016-11-20 20:58:55
AFAIK,“多到多”模型意味着在用户空间中执行调度,因此这意味着每个程序必须在每个内核线程中有自己的调度程序,使用它在分配给它的用户线程之间共享该线程。换句话说:您需要类似于在每个内核线程中运行的GNU之类的东西来分派分配给该内核线程(https://www.gnu.org/software/pth/)的用户线程。
https://stackoverflow.com/questions/40707221
复制相似问题