news 2026/5/3 23:21:17

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/5/3 9:03:46

11.2 基于FreeRTOS的软件架构设计

11.2 基于FreeRTOS的软件架构设计 在完成机器人系统的功能与实时性分解后,软件架构设计是将理论分析转化为可实施、可维护且满足确定性要求的软件蓝图的关键步骤。基于FreeRTOS的架构设计,其核心在于将不同实时性等级的功能模块映射为具体的RTOS任务,并定义这些任务之间的层…

作者头像 李华
网站建设 2026/5/3 19:55:25

Z-Image-Turbo备份恢复机制:模型与数据双保险部署方案

Z-Image-Turbo备份恢复机制:模型与数据双保险部署方案 Z-Image-Turbo_UI界面设计简洁直观,功能布局清晰,专为图像生成任务优化。主界面分为几个核心区域:提示词输入区、参数调节面板、生成预览窗口以及历史记录查看入口。用户无需…

作者头像 李华
网站建设 2026/5/1 3:45:04

小米音乐Docker终极部署指南:快速搭建智能家庭音乐系统

小米音乐Docker终极部署指南:快速搭建智能家庭音乐系统 【免费下载链接】xiaomusic 使用小爱同学播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为小爱音箱的音乐资源限制而烦恼吗&#xff…

作者头像 李华
网站建设 2026/5/1 11:41:30

通义千问CLI实战手册:从入门到精通的完整攻略

通义千问CLI实战手册:从入门到精通的完整攻略 【免费下载链接】Qwen The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen 你是否曾经在复…

作者头像 李华
网站建设 2026/5/1 12:37:32

终极配置手册:轻松突破音乐播放限制

终极配置手册:轻松突破音乐播放限制 【免费下载链接】xiaomusic 使用小爱同学播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为小爱音箱无法播放心仪歌曲而烦恼吗?版权限制、会员…

作者头像 李华
网站建设 2026/5/1 3:42:33

AtlasOS系统优化终极指南:5步让你的电脑运行速度翻倍

AtlasOS系统优化终极指南:5步让你的电脑运行速度翻倍 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1…

作者头像 李华