加载中...
内核线程由操作系统内核直接创建和调度,用户线程则在用户态由线程库管理。两者通过不同的映射模型组合,决定了线程的调度粒度、并行能力和上下文切换开销。

| 内核线程 | 内核调度可并行 |
| 用户线程 | 用户态库管理 |
| 主流模型 | 一对一 |
| 权衡点 | 开销与并行度 |
内核线程与用户线程是操作系统实现多线程的两种执行实体。内核线程由内核感知并调度,能够真正并行地运行在多个处理器上;用户线程则完全在用户态由运行库维护,内核对其无感知。理解二者的区别与映射关系,是掌握多线程原理的关键。
用户线程在应用程序内部由线程库负责创建、切换和销毁,速度快、开销小,但内核只看到承载它们的进程或内核线程。若某个用户线程发起阻塞式系统调用,整个承载它的内核实体可能一并被阻塞。内核线程由操作系统直接管理,拥有独立的调度实体,可被分配到不同 CPU 上真正并行,但创建和切换需要陷入内核,开销相对较高。实际系统通过不同的映射模型把二者结合起来。
大多数现代操作系统采用一对一模型,使多线程程序能充分利用多核处理器,并让阻塞调用只影响单个线程。用户态协程和轻量线程则在此之上进一步发展,通过在用户态灵活切换来支撑海量并发连接,常见于高并发网络服务;而对实时性和并行度要求高的系统则倚重内核线程的直接调度能力。
问:用户线程和内核线程哪个更快?答:用户线程的创建和切换不需陷入内核,通常更快、更省资源;但内核线程能被独立调度到多核上真正并行。两者各有优势,现代系统多用一对一模型兼顾。
问:一个用户线程阻塞会影响其他线程吗?答:在多对一模型中,一个用户线程的阻塞式系统调用会导致整个内核实体被阻塞,连累其他用户线程;而在一对一模型中,每个线程有独立内核实体,阻塞只影响自身。

| 内核线程 | 内核调度可并行 |
| 用户线程 | 用户态库管理 |
| 主流模型 | 一对一 |
| 权衡点 | 开销与并行度 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧