跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
线程模型(Thread Model)
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目适用于理解操作系统中的线程模型基础,涵盖用户线程、内核线程及混合实现。示例代码以C/Java/Python为主,需具备基础编程知识。}} = 线程模型(Thread Model) = '''线程模型'''是操作系统实现并发执行任务的核心机制,描述线程如何被创建、调度和管理。根据线程与内核的交互方式,主要分为'''用户级线程'''、'''内核级线程'''和'''混合型线程'''三种模型。 == 基本概念 == 线程是进程内的独立执行单元,共享同一地址空间和资源。与进程相比,线程的创建、切换和销毁开销更小。线程模型的选择直接影响程序的并发性能和系统响应能力。 === 关键术语 === * '''用户线程(User Thread)''':完全在用户空间管理的线程,内核无感知 * '''内核线程(Kernel Thread)''':由操作系统内核直接管理的线程 * '''轻量级进程(LWP)''':内核支持的用户线程映射机制 * '''多路复用(Multiplexing)''':多个用户线程映射到少量内核线程 <mermaid> graph TD A[线程模型] --> B[用户级线程] A --> C[内核级线程] A --> D[混合型线程] B --> E[无需内核支持] C --> F[系统调用创建] D --> G[N:M映射关系] </mermaid> == 用户级线程模型 == === 实现原理 === 完全由用户空间的线程库(如POSIX的pthread)管理,内核仅感知单进程。线程切换通过库函数调用来完成,无需陷入内核模式。 '''优点''': * 线程切换速度快(无模式切换) * 可定制调度算法 * 适用于任意操作系统 '''缺点''': * 一个线程阻塞会导致整个进程阻塞 * 无法利用多核CPU === 代码示例 === <syntaxhighlight lang="c"> #include <pthread.h> #include <stdio.h> void* thread_task(void* arg) { printf("User thread ID: %ld\n", (long)pthread_self()); return NULL; } int main() { pthread_t t1, t2; pthread_create(&t1, NULL, thread_task, NULL); pthread_create(&t2, NULL, thread_task, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); return 0; } </syntaxhighlight> '''输出示例''': <pre> User thread ID: 140045620208384 User thread ID: 140045611815680 </pre> == 内核级线程模型 == === 实现原理 === 每个用户线程对应一个内核线程,由操作系统内核直接管理。线程创建、调度和同步都需要系统调用。 '''优点''': * 真正并行执行(可利用多核) * 一个线程阻塞不影响其他线程 '''缺点''': * 线程切换需要内核介入(开销大) * 创建数量受内核限制 === 系统支持 === 现代操作系统如Linux的'''NPTL'''(Native POSIX Thread Library)和Windows线程API均采用此模型。 <mermaid> sequenceDiagram participant User participant Kernel User->>Kernel: 创建线程请求 Kernel->>Kernel: 分配TCB资源 Kernel-->>User: 返回线程ID User->>Kernel: 线程切换请求 Kernel->>Kernel: 上下文切换 </mermaid> == 混合型线程模型 == === N:M映射原理 === 结合前两种模型的优势,将N个用户线程映射到M个内核线程(轻量级进程)。典型实现如: * Solaris的'''LWP'''(Light Weight Process) * Go语言的'''goroutine'''调度器 '''调度过程''': # 用户级调度器分配线程给LWP # 内核调度LWP到物理CPU # 当LWP阻塞时,调度器将其他用户线程绑定到空闲LWP === 性能公式 === 最优线程数估算(Amdahl定律): <math> T_{\text{optimal}} = \frac{N_{\text{cores}} \times (1 + \frac{W}{S})} </math> 其中: * <math>W</math> = 等待时间 * <math>S</math> = 服务时间 == 实际应用案例 == === 案例1:Web服务器设计 === '''场景''':Apache HTTP Server的MPM(Multi-Processing Module)选择 * '''prefork''':纯进程模型(无线程) * '''worker''':混合线程模型(多进程+多线程) * '''event''':异步事件驱动+线程池 === 案例2:数据库连接池 === Oracle数据库使用'''共享服务器架构''': * 用户会话作为用户线程 * 共享服务器进程作为内核线程 * 通过'''调度器'''动态分配会话到服务器进程 == 对比总结 == {| class="wikitable" |+ 线程模型对比表 ! 特性 !! 用户线程 !! 内核线程 !! 混合模型 |- | 创建开销 || 低 || 高 || 中 |- | 并发能力 || 单核伪并发 || 多核真并发 || 多核真并发 |- | 阻塞影响 || 整个进程阻塞 || 仅当前线程阻塞 || 仅当前LWP阻塞 |- | 典型实现 || Python threading || Linux pthread || Go runtime |} == 进阶话题 == * '''协程(Coroutine)''':用户态协作式线程 * '''Scheduler Activations''':混合模型的优化方案 * '''CPU亲和性''':线程绑核技术 {{Warning|在Linux中通过<code>ulimit -s</code>可查看线程栈大小限制,默认通常为8MB}} == 参见 == * [[进程间通信]] * [[同步原语]] * [[并发编程模型]] [[Category:计算机科学]] [[Category:面试技巧]] [[Category:操作系统]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)