news 2026/3/27 21:14:09

9.3 SMP下的同步机制:自旋锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
9.3 SMP下的同步机制:自旋锁

9.3 SMP下的同步机制:自旋锁

在单核实时系统中,保护共享资源的典型手段是在临界区内暂时屏蔽中断。然而,在对称多处理(SMP)架构中,此方法完全失效:一个核心屏蔽自身中断,无法阻止其他核心同时访问同一共享内存区域。这种跨核并发访问会引发数据竞争,导致系统状态损坏。因此,SMP系统必须引入一种新的、核间可见的同步原语。FreeRTOS SMP实现中,自旋锁(Spinlock)扮演了这一关键角色,成为保护内核短临界区、实现高效多核协作的基石。

9.3.1 SMP同步的挑战与自旋锁的引入

自旋锁的本质是一种基于忙等待(Busy-Waiting)的互斥锁。其基本工作模式可描述为:当一个任务(或核心)尝试获取(Acquire)一个已被持有的自旋锁时,它将在一个紧凑的循环中不断检查锁的状态,直至锁被释放,而不是立即放弃CPU。

在SMP场景下,自旋锁相较于传统互斥量的优势在于其极低的上下文切换开销。互斥量在争用时会触发任务阻塞与重新调度,这一过程涉及任务状态保存、调度器决策和上下文恢复,开销通常在数微秒到数十微秒量级。对于保护仅需几十到几百个时钟周期的超短临界区(如操作链表指针、更新共享计数器),这种阻塞-唤醒的开销远大于临界区本身的执行时间,严重降低系统效率。自旋锁通过让等待核心在“原地旋转”避免了这一开销。

然而,自旋锁将等待成本转化为对CPU周期的持续消耗。若锁被持有时间过长,等待核心将白白浪费大量计算资源,可能导致系统整体吞吐量下降,甚至引发死锁(如果持有锁的任务被同一核心上更高优先级的任务抢占)。因此,自旋锁的设计哲学遵循一条关键准则:仅适用于保护预期持有时间极短的临界区,且持有期间不得发生可能引起任务切换或长时间延迟的操作。

9.3.2 自旋锁的实现原理:原子操作与内存屏障

自旋锁的正确实现依赖于硬件提供的原子操作内存屏障指令,以确保锁状态的修改和判断在任何核间交互顺序下都具有一致性与可见性。

9.3.2.1 原子操作:锁状态的基石

锁的核心是一个共享的整型状态变量(例如,0表示未锁定,1表示已锁定)。对该变量的“测试并设置”(Test-and-Set, TAS)或“比较并交换”(Compare-and-Swap, CAS)操作必须是原子的,即该操作作为一个不可分割的整体执行,期间其他核心无法介入。

以基于ARMv7-M架构(如Cortex-M4/M7)的LDREX/STREX指令对实现的自旋锁获取操作为例:

// 伪代码示意:尝试原子地将lock从0设置为1uint32_tspinlock_acquire(volatileuint32_t*lock){uint32_tresult;do{// 独占加载当前锁值asmvolatile("ldrex %0, [%1]":"=r"(result):"r"(lock));if(result!=0){// 锁已被占用continue;// 继续循环等待}// 尝试独占存储1到锁位置asmvolatile("strex %0, %1, [%2]":"=r"(result):"r"(1),"r"(lock));// 如果strex成功(result==0),则获取锁成功;否则(result==1),表示在加载和存储间锁被其他核心修改,需重试}while(
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 18:34:44

终极指南:5步在Linux上运行macOS虚拟机

终极指南:5步在Linux上运行macOS虚拟机 【免费下载链接】OneClick-macOS-Simple-KVM Tools to set up a easy, quick macOS VM in QEMU, accelerated by KVM. Works on Linux AND Windows. 项目地址: https://gitcode.com/gh_mirrors/on/OneClick-macOS-Simple-KV…

作者头像 李华
网站建设 2026/3/26 22:49:14

突破传统:3D球体动态抽奖系统让活动策划更出彩

突破传统:3D球体动态抽奖系统让活动策划更出彩 【免费下载链接】log-lottery 🎈🎈🎈🎈年会抽奖程序,threejsvue3 3D球体动态抽奖应用。 项目地址: https://gitcode.com/gh_mirrors/lo/log-lottery 还…

作者头像 李华
网站建设 2026/3/27 16:47:10

告别繁琐配置!BSHM一键启动人像抠图环境

告别繁琐配置!BSHM一键启动人像抠图环境 你是否还在为部署人像抠图模型焦头烂额?装CUDA版本不对、TensorFlow兼容报错、conda环境冲突、模型路径找不到……折腾两小时,连第一张图都没跑出来。今天这篇实测笔记,就是为你而写——不…

作者头像 李华
网站建设 2026/3/26 22:42:51

OpenCore Legacy Patcher实战指南:突破限制,让老旧Mac焕新升级macOS

OpenCore Legacy Patcher实战指南:突破限制,让老旧Mac焕新升级macOS 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方停止支持的老旧…

作者头像 李华
网站建设 2026/3/15 13:16:11

GPT-OSS-20B自动化部署:CI/CD集成实践

GPT-OSS-20B自动化部署:CI/CD集成实践 1. 引言:为什么选择GPT-OSS-20B进行自动化部署? 你是否遇到过这样的问题:模型训练好了,却卡在部署环节?手动上传、配置环境、调试接口,每一步都像在“走…

作者头像 李华
网站建设 2026/3/17 10:01:50

Z-Image-ComfyUI并发控制技巧,避免GPU资源耗尽

Z-Image-ComfyUI 并发控制技巧,避免 GPU 资源耗尽 在实际部署 Z-Image-ComfyUI 过程中,很多开发者都经历过这样的场景: 刚跑通第一个生成任务,兴奋地批量提交 5 个提示词——结果网页卡死、API 返回 503、nvidia-smi 显示显存占用…

作者头像 李华