Linux 和 Windows 中的多线程模型

Zeo*_*kav 5 linux windows multithreading operating-system

在过去的几个月里,我一直在学习关于操作系统的课程。但是,我想对我读到的一点进行澄清。根据我的理解,有三种类型的多线程模型可以将用户级线程映射到内核级线程 -

  • 多对一模式
  • 多对多模型
  • 一对一模型

我可以理解为什么多对一模型在并行处理方面效率不高——因为阻塞系统调用意味着停止任何处理。
然而,在我所指的《操作系统概念》一书中(Abraham Silberschatz、Greg Gagne 和 Peter Galvin 着),它说 Linux 和 Windows 系列都使用一对一的模型,尽管创建过程会产生额外的开销每个创建的用户线程都有一个内核线程。
多对多模型不是更好吗?因为您有许多内核线程,足以具有高度的并行性,并且您始终可以选择两级模型将用户级线程绑定到内核级线程。

TLDR:尽管 Windows 和 Linux 系统的开销较大,但为什么一对一多线程模型比多对多模型更受欢迎?

use*_*003 3

多对多模型不是更好吗?

我建议再买一本书。AFAIK 多对多模型完全是理论上的(如果有人知道使用它的系统,请在评论中指出)。这些模型是解释线程的一种非常糟糕的方式。

在过去,操作系统没有线程的概念。他们安排了执行流程。事实上,对于许多操作系统来说仍然是这样。

对线程的需求很大程度上是由需要“任务”支持的 Ada 编程语言驱动的。为了获得兼容的 Ada 实现,必须有一个在单个进程中模拟线程的库。在这样的系统中,进程调度自己的线程执行(“用户线程”)。这有一个缺点,即线程总是交错运行(从不在不同处理器上并行运行)。

这被称为“多对一”,但这是对正在发生的事情的一个糟糕的描述。您的模型称“许多用户线程”被映射到单个“内核线程”。实际上,不存在内核线程。相反,线程是在进程的上下文中实现的。

操作系统通常将进程视为具有多个可调度执行线程的地址空间。在这样的系统中,线程是调度的基本单位;不是过程。是您方案中的一对一模型。

它说 Linux 和 Windows 系列都使用一对一模型,尽管为每个创建的用户线程创建内核线程会产生额外的开销。

这有点废话。无论线程如何实现,都会产生开销。您经常会发现人们声称“多对一”比“一对一”更有效。这种说法似乎只是都市传说。

为什么尽管 Windows 和 Linux 系统中的开销较大,但一对一多线程模型优于多对多模型?

“一对一”(又名内核线程)模型更可取,因为它利用多个处理器并允许并行实际执行。它还避免了某些系统(例如太监)中可能发生的阻塞问题。