news 2026/8/29 5:54:46

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/8/27 16:28:56

一键下载!国家中小学智慧教育平台电子课本PDF获取全流程

一键下载!国家中小学智慧教育平台电子课本PDF获取全流程 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为无法离线使用电子课本而苦恼吗&#xf…

作者头像 李华
网站建设 2026/8/26 21:11:07

Czkawka终极指南:快速释放存储空间的免费重复文件清理工具

Czkawka终极指南:快速释放存储空间的免费重复文件清理工具 【免费下载链接】czkawka 一款跨平台的重复文件查找工具,可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点,帮助用户释放存储空间。 项目地址: https:/…

作者头像 李华
网站建设 2026/8/27 12:43:59

VibeThinker-1.5B-WEBUI部署复盘:常见错误与修复方案

VibeThinker-1.5B-WEBUI部署复盘:常见错误与修复方案 微博开源的小参数模型 VibeThinker-1.5B,凭借其在数学和编程任务上的出色表现,正逐渐成为开发者和算法爱好者的新宠。该模型虽仅有15亿参数,却在推理能力上展现出惊人的潜力&…

作者头像 李华
网站建设 2026/8/27 15:32:45

Kronos金融预测模型终极指南:从新手到实战的完整解决方案

Kronos金融预测模型终极指南:从新手到实战的完整解决方案 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos Kronos是一个基于Transformer架构的金…

作者头像 李华
网站建设 2026/8/27 15:49:05

cv_unet_image-matting适合新手吗?零基础部署教程快速上手

cv_unet_image-matting适合新手吗?零基础部署教程快速上手 1. 这个工具真的适合零基础用户吗? 你是不是也遇到过这样的问题:想给人像换背景,但PS抠图太费时间,边缘处理不好还显得假;或者做电商主图时&…

作者头像 李华
网站建设 2026/8/27 16:50:08

通义千问CLI实战指南:5步掌握命令行AI助手的核心应用

通义千问CLI实战指南:5步掌握命令行AI助手的核心应用 【免费下载链接】Qwen The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen 还在为…

作者头像 李华