news 2026/8/31 23:42:00

进程与线程到底差在哪?Linux 内核给出答案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进程与线程到底差在哪?Linux 内核给出答案

进程与线程到底差在哪?Linux 内核给出答案

“进程是资源分配的单位,线程是调度的单位”——这句话背了无数遍,但你真的理解了吗?今天不从教科书出发,直接翻开 Linux 内核源码:进程和线程在内核里到底是什么?答案可能颠覆你的直觉:它们都是同一个结构体 task_struct

一、教科书里的 PCB 与内核里的 task_struct

操作系统原理课告诉我们:每个进程有一个 PCB(进程控制块),装着状态、寄存器现场、地址空间、打开的文件、优先级……

到了 Linux v6.x 这个工业级内核,PCB 落地成一个具体得不能再具体的结构体——task_struct(定义在include/linux/sched.h)。它是内核里被引用最频繁、最庞大的结构体之一,是理解整个进程子系统的"总钥匙"。

关键字段长这样(节选):

structtask_struct{structthread_infothread_info;/* 内核栈信息 */unsignedint__state;/* 进程状态 */intprio;/* 动态优先级 */conststructsched_class*sched_class;/* 调度类 */structsched_entityse;/* CFS 调度实体 */structmm_struct*mm;/* 内存描述符(地址空间)*//* ... 文件表、信号、命名空间…… */};

二、颠覆认知:线程也是 task_struct

重点来了:在 Linux 眼里,进程和线程没有本质区别——都是 task_struct。那它们差在哪?看mm字段:

  • 进程:每个 task_struct 有独立的mm(地址空间),互不共享
  • 线程:多个 task_struct共享同一个mm,只是各自有独立的栈和寄存器现场

所以"进程 vs 线程"的区别,在内核里就是一句话:共享不共享地址空间。这也是为什么线程也叫"轻量级进程"(LWP)——创建线程不需要复制整个地址空间,只需新建一个 task_struct 并指向同一个 mm。

三、内核栈与 current:怎么找到"我是谁"

每个 task_struct 都配一块内核栈(x86-64 上是 16KB)。内核里到处要"拿到当前任务的 task_struct",这就是current宏做的事。

早期内核把 thread_info 放在栈底,靠"栈指针对齐"算出 task_struct 地址;Linux v6.x 默认CONFIG_THREAD_INFO_IN_TASK,thread_info 直接嵌进 task_struct 首部,current变成读一个每 CPU 的当前任务指针——O(1) 拿到"我是谁"。

这个细节告诉你:工业级代码和教科书模型的差别,往往藏在"性能"和"安全"的取舍里。

四、代码演示:用 Python 模拟 task_struct 与进程/线程

fromdataclassesimportdataclass,field@dataclassclassTaskStruct:pid:intstate:str="TASK_RUNNING"prio:int=120mm:object=None# 内存描述符(地址空间)files:list=field(default_factory=list)parent:object=Nonechildren:list=field(default_factory=list)defcreate_process(pid,parent=None):t=TaskStruct(pid=pid,mm={"code":"0x400000","stack":"0x7fff"},parent=parent)ifparent:parent.children.append(t)returntdefcreate_thread(pid,parent):t=TaskStruct(pid=pid,mm=parent.mm,parent=parent)# 共享 mm!parent.children.append(t)returnt main=create_process(1000)t1=create_thread(1001,main)# 线程:共享地址空间p1=create_process(1002,main)# 进程:独立地址空间print(f"线程 t1 与主进程共享地址空间:{t1.mmismain.mm}")print(f"进程 p1 与主进程地址空间独立:{p1.mmisnotmain.mm}")print(f"内核视角: 三者都是 task_struct, 主进程 children={[c.pidforcinmain.children]}")

运行输出:

线程 t1 与主进程共享地址空间: True 进程 p1 与主进程地址空间独立: True 内核视角: 三者都是 task_struct, 主进程 children=[1001, 1002]

这个模型虽然简化,但抓住了内核视角的本质:进程和线程都是 task_struct,区别只在 mm 是否共享

五、避坑清单

  1. "线程是调度的单位"不完全准确:Linux 的调度器调度的是 task_struct(也叫任务),进程和线程都参与调度
  2. 线程切换不一定比进程切换快:同进程线程切换省了地址空间切换(TLB 刷新),但现代 CPU 上这个差距在缩小
  3. 多线程崩溃会带走整个进程:共享地址空间意味着一个线程的野指针可能毁掉所有线程
  4. task_struct 很大(v6.x 上约 7KB):所以内核用 slab 缓存复用,创建线程也要小心分配开销
  5. 看内核源码别被吓到:task_struct 有几百个字段,按语义分段读(调度/内存/文件/信号),一次只读一段

六、想系统学 Linux 内核?

本文精选自ima 知识号【Kruptos】《Linux内核源码精读》订阅库(第 011 期 task_struct 进程在内核里到底是什么、第 012 期 fork/clone/vfork 源码路径等 100 期系统教程,从启动流程、进程管理、内存管理、文件系统到调度器,每期配可运行代码)。

📚 完整系列 100 期 + 配套代码,已在 ima 知识号发布

本文只是系列的一个切片。完整系列(100 期系统教程 + 每期可运行代码)在 ima 知识号【Kruptos】持续更新中:

  • 🗂 67+ 技术知识库:信号与系统、SDR 软件无线电、数字信号处理、操作系统、AI Agent、大模型微调……几乎覆盖全部软硬件技术栈
  • 🧠 8 款 AI 技能:系列生产、知识库管理、CMMI 受管开发、自进化 Agent 等,已在 ima 技能广场上架,即装即用
  • ✅ 全部免费订阅,后续更新自动推送

🔍 订阅方式:打开 ima(腾讯智能工作台)→ 搜索「Kruptos」→ 一键订阅。或在 ima 内直接搜索《Linux内核源码精读》等知识库名称。


作者:Kruptos(西电毕业,13 年无线通信/DSP/嵌入式科研)|原创内容,转载注明出处

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 23:41:55

IoT设备紧凑型板载电源选型:从LDO到DC-DC的工程实践指南

1. 当"IoT"三个字出现在需求表里,电源部分就先变难了 这几年帮朋友和合作方评估过不少IoT设备方案,从智能门锁、环境传感器到边缘网关,几乎每次需求评审聊到供电,都会出现同一个矛盾:核心处理器、无线模块、…

作者头像 李华
网站建设 2026/8/31 23:39:31

哪款数据分析工具更好用?2026主流软件全面测评推荐.

哪款数据分析工具更好用?2026主流软件全面测评推荐 你有没有遇到过这些场景:需要整理业务数据输出汇报图表,反复调试表格公式耗费大量时间;整理完报告之后,还需要手动把报告内的数据重新复制粘贴制作图表;做…

作者头像 李华
网站建设 2026/8/31 23:38:36

FMC子卡选型与设计实战:从VITA 57标准到高速I/O布局

做 FPGA 平台时间久了,会有一种感觉:真正卡住进度的往往不是 FPGA 本身,而是外围 I/O。传感器的电平不匹配、视频接口类型换了、客户临时要加几路同步触发,这些需求的共性是全都发生在板级物理接口这一层。FMC 这种 mezzanine 结构…

作者头像 李华
网站建设 2026/8/31 23:35:36

音频DAC选型与实战:从R2R到Delta-Sigma,解决噪声与振铃

最近圈子里聊得比较多的,是面向专业音频设备的新款DAC方案。说白了,DAC(数模转换器)就是数字音频和模拟世界之间的那道桥,尤其到了High-Res Audio(高解析度音频)时代,录音接口、调音…

作者头像 李华
网站建设 2026/8/31 23:35:09

Claude Code 接上 Chrome 之后,前端开发真正形成了 Build Test Fix 闭环

最近在研究 Claude Code 的浏览器能力时,我越来越觉得,Use Claude Code with Chrome 这项能力不能只理解成给 Claude Code 装了一个浏览器插件。 如果只是把它理解为网页自动化,很容易把它和 Playwright、Puppeteer、Selenium,甚至 Chrome DevTools MCP 混在一起。真正有意…

作者头像 李华
网站建设 2026/8/31 23:31:19

星三角降压启动电路 · 全程精讲

ESim电工课堂 零基础学电工 星三角降压启动电路 全程精讲 从原理到接线,从元件到逻辑,从仿真到实操 。 一课搞懂工厂最经典的三相电机降压启动方案。 📚 建议学时:90 分钟 | 🎯 难度:★★☆☆☆&…

作者头像 李华