【发布时间】:2026-01-02 08:20:05
【问题描述】:
在过去的几个月里,我一直在学习操作系统课程。但是,我想对我读到的一点进行澄清。据我了解,将用户级线程映射到内核级线程的多线程模型分为三种类型-
- 多对一模型
- 多对多模型
- 一对一模型
我明白为什么多对一模型在并行处理方面效率不高 - 因为阻塞系统调用意味着停止任何处理。
但是,在我所指的《操作系统概念》(Abraham Silberschatz、Greg Gagne 和 Peter Galvin 着)一书中,它说 Linux 和 Windows 家族都使用一对一模型,尽管创建时会产生额外的开销创建的每个用户线程的内核线程。
多对多模型不是更好吗?因为您有许多内核线程,足以具有高度的并行性,并且您始终可以选择两级模型来将用户级线程绑定到内核级线程。
TLDR:尽管 Windows 和 Linux 系统的开销很大,为什么一对一的多线程模型优于多对多模型?
【问题讨论】:
-
因为在多对多模型中会引入更多开销。 (但是有些架构使用它,尤其是 Goroutines 或 Actors。
-
@eckes 感谢您的快速回复。你能详细说明一下吗?究竟是什么在多对多模型中引入了更多开销?
-
除了操作系统中的任务调度程序之外,您基本上还必须在软件中实现任务调度程序。这还包括一种切换执行任务或上下文的方法。对于 Actor 模型或无堆栈软件线程,我想第二点问题不大。
-
至少在 Windows 上,开销是最小的。与默认的用户模式堆栈 1MB 相比,内核堆栈只占用大约三页。大约 1.2%,我猜还有少量的家务。虽然我不是专家,但显然只有一种线程必须极大地简化事情,所以这可能是一个明智的权衡。
标签: linux windows multithreading operating-system