![Windows 和 Debian/Red Hat 是否使用相同的线程管理?](https://linux22.com/image/1429419/Windows%20%E5%92%8C%20Debian%2FRed%20Hat%20%E6%98%AF%E5%90%A6%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E7%BA%BF%E7%A8%8B%E7%AE%A1%E7%90%86%EF%BC%9F.png)
我需要知道 Windows 和 Debian/Red Hat 在其最新版本中使用什么类型的线程管理。
我知道他们曾经使用 1 对 1 线程管理模型。他们现在还使用这个模型吗?还是他们改变了它?
答案1
win32 API 同时支持一对一和多对多模型(分别在线程库和纤程库中)。
Windows 7 与 NT 家族的所有产品一样,支持 win32 API。
Windows 7 支持内核线程。因此它必须是一对一模型或多对多模型。但实际上它是一种支持这两种模型的混合模型。默认情况下,它将使用传统的一对一调度,但根据操作系统可用的调度实体数量(基于处理器和核心的数量),您可以强制将其转换为多对多调度程序。操作系统本身永远不会自动切换。您必须明确告诉它。
注意:Windows 7 32位版本不支持M:N调度,只有64位版本才支持。
Linux 还可以通过 RIBS2 等库支持 M:N,就像 Windows 通过 fiber API 支持一样。
混合总是更好,因为您可以选择优化线程调度,而以前您只有一个选择。但要真正利用多对多调度程序则完全是另一回事。这将在很大程度上取决于您对大量线程的需求以及它们实际上在做什么。不过,我不知道确切的细节,因为我从未参与过需要创建大量线程的高性能项目。然而,我的理解是,对线程进行编程变得更简单,但管理它们变得更难。特别是,您在测试阶段花费大量时间尝试优化线程以适应更复杂的调度程序。
在 Windows 7 之前,Windows 使用一对一的用户线程与内核线程关系。当然,总是可以拼凑一个粗略的多对一用户调度程序(这几乎可以在任何具有用户级计时器中断的操作系统中完成),但如果系统调用在任何一个用户线程上被阻止,它将阻止内核线程,从而阻止同一调度程序上的所有其他用户线程。当然,多对一模型无法利用 SMP。
在 Windows 7 中,Microsoft 引入了对用户模式调度的支持。程序可以将一个或多个内核线程配置为调度程序(每个逻辑处理器一个),然后创建一个用户模式线程池,这些 UMS 可以从中获取。内核维护一个未完成系统调用列表,允许 UMS 继续运行而不会阻止内核线程。此配置可以用作多对一或多对多。