ARM架构下进程和线程的核心区别(切换+创建)

发布时间:2026/8/20 14:09:20

ARM架构下进程和线程的核心区别(切换+创建)
疑问为什么进程的切换开销比线程大进程切换全流程1. 触发调度进入内核态进程 A 正在用户态运行CPU 接到中断信号。硬件自动保存现场在进入内核异常处理程序前CPU 硬件会自动完成以下原子操作保存 PC把被打断的用户态程序地址存入 ELR_EL1。PC程序计数器ELR_EL1 Exception Link Register, Exception Level 1异常链接寄存器异常级别 1—存放下一条本该执行的用户态指令地址保存 PSTATE把当前 CPU 状态存入 SPSR_EL1。PSTATEProcessor State处理器状态—存放当前CPU的条件标志位和异常屏蔽位SPSR_EL1Saved Program Status Register, Exception Level 1保存的程序状态寄存器异常级别 1—PSTATE的值保存位置屏蔽中断设置 PSTATE 的中断屏蔽位。切换栈指针从用户栈 SP_EL0 切换到内核栈 SP_EL1。SP_EL0Stack Pointer, Exception Level 0栈指针异常级别0—指向用户态程序的栈顶SP_EL1Stack Pointer, Exception Level 1栈指针异常级别1—指向内核态程序的栈顶切换页表地址翻译的基址寄存器自动从 TTBR0_EL1切换到 TTBR1_EL1并跳转到固定的内核异常向量入口。TTBR0_EL1Translation Table Base Register 0, Exception Level 1转换表基址寄存器0—用户页表TTBR1_EL1Translation Table Base Register 1, Exception Level 1转换表基址寄存器1—内核页表软件手动保存剩余上下文异常向量入口代码会跳转到中断处理函数。此时内核会用 kernel_entry 宏把被硬件自动保存的 ELR_EL1、SPSR_EL1以及剩余的通用寄存器全部压入当前的内核栈。现在进程 A 的用户态完整快照就安全地存在它的内核栈中了。调用调度器中断处理函数在完成计时更新等操作后发现进程 A 的时间片已用完于是调用 schedule() 函数。2. 选出下一个进程__schedule()//调度器核心函数首先调用 pick_next_task()根据调度类优先级选出任务。对于普通进程CFS 会从红黑树中取出最左节点作为 next 进程。3. 执行上下文切换context_switch()切换虚拟内存空间*本质区别switch_mm()切换 ASID将新进程的 ASID 写入 TTBR0_EL1 寄存器。TLB 管理内核将TTBR 值与新 ASID的组合配置进硬件。此后CPU 查找 TLB 时会自动匹配当前 ASID。进程 A 的旧 TLB 条目因 ASID 不匹配而逻辑上失效但物理上可能仍在这为将来切回进程 A 时保留了性能优化的可能。TLBTranslation Lookaside Buffer页表缓存/快表—虚拟地址到物理地址的映射关系ASIDAddress Space Identifier地址空间标识符—给 TLB 条目打上进程标签避免进程切换时频繁刷新整个 TLB切换处理器上下文switch_to()保存内核栈指针和 PC将当前 CPU 的栈指针 SP 和架构相关的特殊寄存器存入 prev 进程的 thread_struct 中。这里的 LR 就是切换后要恢复执行的下一条指令地址。加载新内核栈将 CPU 的 SP 寄存器直接指向 next 进程的 thread.cpu_context.sp。恢复新进程的寄存器从 next 的新内核栈中弹出它之前被切换时保存的寄存器FP, LR 等最后执行 ret 指令。ret 指令会使 CPU 跳转到 LR 指向的地址。此刻CPU 已完全运行在进程 B 的内核栈和地址空间中。4. 返回用户空间恢复执行恢复用户态上下文执行 kernel_exit 宏从进程 B 的内核栈中弹出它上次被切出时保存的用户态寄存器X0-X30, SP_EL0 等。异常返回指令 硬件执行ERET恢复 PC从 ELR_EL1 寄存器恢复程序计数器指向进程 B 用户态代码。恢复 PSTATE从 SPSR_EL1 恢复进程状态。切换栈和页表栈指针切回用户栈 SP_EL0页表基址切回用户表 TTBR0_EL1。调度切换核心区别辨析本质区别// context_switch() 中的逻辑if(next-mm!prev-mm){// 下一个“程”的mmMemory Manager结构体mm_struct 不等于 前一个“程”的结构体switch_mm(prev-active_mm,next-mm,next);// 执行切换虚拟内存空间*}kernel源码定位/include/linux/mm_types.hstruct mm_structmm指针指向的结构体为什么执行切换虚拟内存空间是整个过程当中最耗时的部分switch_mm() 函数本身的直接操作并不耗时写 TTBR0_EL1切换 ASID很快真正的巨大开销来自切换之后的连锁反应TLB 未命中切换地址空间后旧进程的 TLB 条目全部逻辑失效。新进程刚开始执行时每一次访问内存取指令、读写数据都会 TLB 未命中。硬件被迫去内存中逐级遍历页表ARM64 是 3-4 级这个过程通常需要几十到几百个 CPU 周期。一个进程刚恢复执行时会连续发生数十甚至上百次这样的未命中累积开销非常可观。Cache 未命中新进程的数据大概率不在当前 CPU 的 L1/L2 Cache 里。用上一步好不容易拿到的物理地址去查 Cache结果也没命中必须去访问真正的物理内存。进程创建全流程创建进程fork()创建线程pthread_create()用户态 fork()│▼SVC 陷入内核│▼sys_clone() → kernel_clone()│▼copy_process()│├── dup_task_struct() # 分配 task_struct 独立内核栈├── copy_mm() # 进程复制页表COW/ 线程共享 mm├── copy_fs() # 复制/共享 文件系统信息├── copy_files() # 复制/共享 文件描述符表├── copy_sighand() # 复制/共享 信号处理表├── 分配 PID / TGID # 进程独立 PID / 线程共享 TGID├── 复制 pt_regs 并改返回值 # 子进程 fork 返回 0└── 初始化调度实体│▼wake_up_new_task() # 放入运行队列│▼父进程返回子进程 PID│▼调度器选中子进程后子进程返回 0开始执行用户态代码创建初始化核心区别辨析本质内核的系统调用的clone()传入的参数不同// 创建进程fork() 内部调用clone(SIGCHLD,0);// 默认处理动作SIGCHLD忽略// 创建线程pthread_create() 内部调用clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD,0);对应 clone 标志位资源fork 创建进程pthread_create 创建线程CLONE_VM虚拟地址空间mm (mm_struct)复制一份新的共享一个CLONE_FS文件系统信息 fs(fs_struct)复制引用计数共享一个CLONE_FILES打开的文件表files (files_struct)复制一份新的共享一个CLONE_SIGHAND信号处理表 signal(sighand_struct)复制共享 一个CLONE_THREAD进程 IDTGID新的共享 一个

相关新闻

交流充电桩互操作性测试:从标准到实践,解决“充不上电”的兼容性难题

交流充电桩互操作性测试:从标准到实践,解决“充不上电”的兼容性难题

2026/8/20 14:09:20

1. 从“充不上电”的尴尬说起:为什么我们需要互操作性测试? 如果你是一位电动汽车车主,或者从事过充电桩的安装、运维工作,大概率遇到过这样的场景:你的爱车开到一台陌生的公共充电桩前,扫码、插枪&#xf…

AI监管与开源模型:开发者应对策略与本地部署实战

AI监管与开源模型:开发者应对策略与本地部署实战

2026/8/20 14:09:20

最近,AI领域的讨论似乎陷入了一个奇怪的循环:一边是开发者社区对开源模型的热情空前高涨,各种“一键部署”、“本地运行”的教程层出不穷;另一边,则是关于AI监管、权力集中和潜在风险的严肃辩论,仿佛来自两…

宝骏销量逆势增长38%:下沉市场燃油车需求洞察与产品策略分析

宝骏销量逆势增长38%:下沉市场燃油车需求洞察与产品策略分析

2026/8/20 13:59:19

1. 市场现象:一个“非主流”的销量样本 最近看到一份2月份的汽车销量数据,宝骏品牌同比增长了38%,这个数字在当下这个竞争白热化的市场里,显得有点扎眼。更值得玩味的是,它的销量构成里,宝骏510和宝骏310这…

魔兽争霸3还能再战十年:WarcraftHelper免费辅助工具,一次解决现代电脑上的兼容性难题

魔兽争霸3还能再战十年:WarcraftHelper免费辅助工具,一次解决现代电脑上的兼容性难题

2026/8/20 14:59:22

魔兽争霸3还能再战十年:WarcraftHelper免费辅助工具,一次解决现代电脑上的兼容性难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelpe…

YoloMouse 游戏光标更换完整指南:三分钟上手,让每款游戏的鼠标指针都听你的

YoloMouse 游戏光标更换完整指南:三分钟上手,让每款游戏的鼠标指针都听你的

2026/8/20 14:59:22

YoloMouse 游戏光标更换完整指南:三分钟上手,让每款游戏的鼠标指针都听你的 【免费下载链接】YoloMouse Game Cursor Changer 项目地址: https://gitcode.com/gh_mirrors/yo/YoloMouse YoloMouse 是一款专为游戏场景设计的开源光标更换工具&#…

当系统弹出“此 Mac 已不支持“:OpenCore Legacy Patcher 把 2007 年的老 Mac 一路续到 Sequoia

当系统弹出“此 Mac 已不支持“:OpenCore Legacy Patcher 把 2007 年的老 Mac 一路续到 Sequoia

2026/8/20 14:59:22

当系统弹出"此 Mac 已不支持":OpenCore Legacy Patcher 把 2007 年的老 Mac 一路续到 Sequoia 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patche…

动物森友会修改器 NHSE 完整上手指南:零基础把存档玩出花

动物森友会修改器 NHSE 完整上手指南:零基础把存档玩出花

2026/8/20 14:59:22

动物森友会修改器 NHSE 完整上手指南:零基础把存档玩出花 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE 存档编辑器(Animal Crossing: New Horizons save editor&…

NBTExplorer快速上手全攻略:一次看懂Minecraft存档数据编辑

NBTExplorer快速上手全攻略:一次看懂Minecraft存档数据编辑

2026/8/20 14:59:22

NBTExplorer快速上手全攻略:一次看懂Minecraft存档数据编辑 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款免费开源的NBT编辑器&…

MAUI Windows应用集成Meadow物联网开发板模拟环境实战

MAUI Windows应用集成Meadow物联网开发板模拟环境实战

2026/8/20 14:49:22

1. 项目概述:在MAUI Windows应用中运行Meadow 最近在折腾一个物联网原型项目,需要在Windows电脑上实时显示并控制一些传感器数据。手头正好有 Wilderness Labs 的 Meadow 开发板,它跑的是 .NET nanoFramework,非常适合嵌入式场景。…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/19 9:17:18

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换

2026/8/20 0:08:45

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com…

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒

2026/8/20 0:08:45

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 判断你是否…

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印

2026/8/20 0:08:45

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 按 3MF 官方规范的字面意思,一…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…