当前位置:嗨网首页>书籍在线阅读

08-混合式线程模型

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.3.2 混合式线程模型

如果我们把内核级线程模型和用户级线程模型结合起来,结果会怎么样呢?是否可以实现“1:1线程模型”带来的真正并行性,同时还可以利用“N:1线程模型”的零成本上下文切换?确实可以,只不过这个模型很复杂。“N:M线程模型”也称为“混合式线程模型”,正是希望能够充分利用前两种模型的优点:内核提供一个简单的线程概念(thread concept),而用户空间也实现用户线程。然后,用户空间(可能和内核结合起来)决定如何把N个用户线程映射到M个内核线程中,其中N≥M。

由于实现机制不同,映射方法也有区别,但是经典策略是不要在一个内核线程中支持大部分的用户线程。一个进程可能包含几百个用户线程,但只包含几个内核线程,由几个处理器(每个处理器至少有一个内核线程支持对系统的完全使用)和阻塞式I/O处理。正如你所想象的,该模型很难实现。由于在Linux中上下文切换成本很低,很多系统开发人员不觉得这个方法可行,1:1模型在Linux系统上还是很普遍。

调度器激活(Scheduler Activation)是一种为用户级线程提供内核支持的解决方案,支持更高效的N:M线程模型。它是在华盛顿大学的一篇学术论文中提出的,后来被FreeBSD和NetBSD采用,成为实现线程模型的核心。调度器激活支持在用户空间控制和观察内核中的进程调度,这使得混合式模型更高效,并解决了因内核不支持而出现的一些问题。 FreeBSD和NetBSD都已经放弃了调度器激活机制,转而采用了更简单的1:1线程模型。这可以归于两个原因,一是N:M模型过于复杂,二是由于x86体系结构变得非常普遍,x86支持相对高效的上下文切换。