跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

Linux 多线程初探:从进程到轻量级执行流

Linux 多线程机制解析。线程是进程内的执行分支,内核调度基本单位。相比进程,线程共享地址空间,创建与切换开销更小,适合多处理器并行及 I/O 重叠。但存在资源竞争、健壮性降低及编程复杂度高等缺点。Linux 下线程复用进程数据结构(task_struct),通过 pthread 库提供接口。掌握线程概念有助于优化 CPU 密集型与 IO 密集型程序性能。

DebugKing发布于 2026/3/16更新于 2026/8/1734 浏览
Linux 多线程初探:从进程到轻量级执行流

Linux 多线程初探:从进程到轻量级执行流

线程的本质与定义

线程是进程内的一个执行分支,其执行粒度比进程更细。在操作系统视角下,线程是调度的基本单位,而进程则是资源分配的基本实体。

以前我们常认为进程只有一个执行流,这其实是一种特殊情况。在现代系统中,一个进程内部包含多个执行流才是常态。内核中,每个执行流对应一个 task_struct 结构体,但所有线程共享同一个地址空间。这意味着任何执行流要运行,都必须依赖进程拥有的资源窗口(如动态库加载、内存申请等)。

进程与线程的资源关系

虚拟地址空间的映射

理解线程的关键在于理解地址空间。CPU 中的 CR3 寄存器存储页表目录地址,负责将虚拟地址转换为物理地址。以 32 位系统为例,虚拟地址被分为三部分(10+10+12),前 20 位定位页框起始位置,后 12 位作为偏移量。

创建进程是一个重操作,因为需要建立完整的地址空间映射。而线程本质上是在已有的地址空间内划分范围进行资源分配,因此开销更小。

Linux 下的线程实现

Linux 并没有独立于进程之外的线程数据结构。它复用进程的内核数据结构 task_struct 来模拟线程,这种机制被称为'轻量级进程'(LWP)。

注意:CPU 无法直接区分 Linux 中的进程和线程,对 CPU 而言它们都是执行流。内核通过调度算法管理这些轻量级进程。

线程的优缺点分析

优势

  1. 轻量级:创建和释放线程的代价远小于进程,生命周期更短。
  2. 切换高效:线程间切换只需保存少量上下文(如寄存器、栈指针),无需切换页表。
  3. 资源共享:线程共享进程的数据段、代码段等资源,通信方便。
  4. 并行能力:能充分利用多处理器的并行计算能力,适合计算密集型任务。
  5. I/O 重叠:在等待慢速 I/O 时,其他线程可继续执行计算,提升用户体验。

劣势

  1. 性能损耗:若计算密集型线程数量超过处理器核心数,过多的同步和调度开销会导致性能下降。
  2. 健壮性降低:线程间缺乏保护,一个线程的错误(如野指针、除零)可能导致整个进程崩溃。
  3. 访问控制弱:进程是访问控制的基本粒度,线程调用某些 OS 函数可能影响整个进程。
  4. 编程复杂:调试多线程程序比单线程困难得多,需处理竞态条件、死锁等问题。

Linux 线程接口实战

虽然内核层面只有轻量级进程的概念,但应用层提供了标准的 POSIX 线程库 pthread 来封装接口。

编译与链接

几乎所有 Linux 平台都默认自带该库。编写多线程代码时,需显式链接 pthread 库:

g++ -o $@ $^ -lpthread

线程创建 (pthread_create)

使用 pthread_create 创建新线程,其参数含义如下:

  • 第一个参数:输出型参数,用于接收新线程的 ID。
  • 第二个参数:线程属性,通常设为 nullptr 使用默认属性。
  • 第三个参数:函数指针,指向线程执行的入口函数(返回 void*,接受 void* 参数)。
  • 第四个参数:传递给线程函数的实参。

成功返回 0,失败则返回错误码(不会设置全局 errno)。需要注意的是,pthread_create 不是系统调用,而是动态库函数。

查看线程信息

可以使用 ps 命令查看进程内的线程(即 LWP):

ps -aL

其中 -L 选项显示轻量级进程信息。主线程的 PID 即为进程 ID,若进程内任意线程异常终止,默认会触发信号机制导致整个进程退出。

总结

本章梳理了 Linux 下线程的核心概念。线程作为轻量级执行流,复用了进程的资源与数据结构。理解其优缺点及 pthread 接口的使用,对于优化 CPU 密集型与 IO 密集型程序至关重要。在实际开发中,合理设计线程模型能有效提升系统性能,但也需警惕并发带来的风险。

目录

  1. Linux 多线程初探:从进程到轻量级执行流
  2. 线程的本质与定义
  3. 进程与线程的资源关系
  4. 虚拟地址空间的映射
  5. Linux 下的线程实现
  6. 线程的优缺点分析
  7. 优势
  8. 劣势
  9. Linux 线程接口实战
  10. 编译与链接
  11. 线程创建 (pthread_create)
  12. 查看线程信息
  13. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 进程实践:手动实现 Shell
  • OpenVLA 详解:基于 Prismatic VLM 与离散化动作预测的通用机器人策略
  • OpenVLA 架构解析:基于 Prismatic VLM 与下一个 Token 预测的动作生成
  • Java 接入阿里百炼大模型实战指南
  • OpenVLA 架构解析:基于 Prismatic VLM 与 Next Token Prediction 的动作生成
  • OpenVLA 深度解析:基于 Prismatic VLM 的离散化动作预测方案
  • Python 金融数据获取指南:使用 mootdx 读取通达信数据
  • MySQL 数据类型详解:从数值到字符串的实战指南
  • Tesseract.js 实现 JavaScript OCR 文本识别教程
  • MySQL 数据类型详解与实战指南
  • XVERSE-Ent:元象开源的泛娱乐中英双语底座大模型
  • 前端安全实战:密码加密、XSS 与 CSRF 防护指南
  • MySQL 数据类型详解:数值、字符串与时间类型的选型实践
  • MySQL 数据类型详解与性能优化实践
  • local-dream 项目实现安卓端 Stable Diffusion 高效运行与骁龙 NPU 加速
  • AI 产品经理的核心能力与转型策略
  • 原生 JavaScript 跨浏览器事件处理兼容方案
  • Copilot vs Claude Code终极对决哪个会更好用呢?
  • 操作系统智能助手 OS Copilot 新功能测评
  • AI 产品经理的核心能力与转型路径解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online