当前位置: 首页 > news >正文

PREEMPT_RT 技术实现:Sleeping spinlocks

了解Sleeping spinlocks之前,我先简单介绍一下spinlock

Spinlock(自旋锁)

自旋锁是 Linux 内核最基础的互斥锁,用来保护临界区同一时刻只能有一个线程/CPU 进入临界区

核心特点:

  • 拿不到锁时不阻塞休眠、不放弃 CPU
  • 在原地循环忙等(自旋),一直轮询直到锁被释放
  • 适合持有时间极短的场景

工作原理

  1. 线程尝试 spin_lock() 加锁
  2. 锁空闲 → 立刻拿到锁,进入临界区
  3. 锁被别人拿着 → 原地循环自旋,不断查锁状态
  4. 持有者 spin_unlock() 释放锁
  5. 自旋的线程立刻抢到锁,继续执行

和 Mutex 区别:

  • Mutex:拿不到就睡眠阻塞,让出 CPU
  • Spinlock:拿不到原地自旋忙等,占着 CPU 不放

适用场景 & 优缺点

优点
  1. 开销极低:无进程调度、无睡眠/唤醒开销
  2. 实现简单
  3. 适合短临界区:锁持有时间 < 一次进程切换耗时,比 mutex 更快
缺点
  1. 忙等浪费 CPU:长时间拿不到锁,CPU 空转浪费算力
  2. 可能造成实时延迟:持有者不释放,其他 CPU 一直自旋
  3. 不能在持有锁时睡眠:一旦睡眠,所有人永久自旋死锁
适用场景
  • 临界区执行时间非常短
  • 中断上下文(不能睡眠,不能用 mutex)
  • 多核间简单同步
  • 不允许进程调度的场景
不适用场景
  • 临界区逻辑复杂、耗时久
  • 可能触发睡眠、调度、内存分配等操作

PREEMPT_RT 实时内核下的Spinlock

特征

非PREEMPT_RT(标准Linux内核)抢占模型中,自旋锁直接映射为原始自旋锁(raw spinlock)。一个等待自旋锁的任务会持续自旋(忙等),直到持有锁的任务释放它;原始自旋锁上下文会禁用抢占

PREEMPT_RT(实时内核)中,普通自旋锁被映射为rt_mutex_base(实时互斥锁),成为睡眠式自旋锁(Sleeping Spinlocks);而原始自旋锁(raw spinlock)保留原有行为。
等待睡眠式自旋锁的任务会主动睡眠,锁被释放时才会被唤醒;睡眠式自旋锁上下文不会禁用抢占

代码实现

从下面的代码实现。不难看出,在preempt_rt kernel中,rt_mutex_base代替raw_spinlock,成为spinlock的底层实现。而rt_mutex_base则是我在文章PREEMPT_RT 技术实现:rt_mutex中介绍过的rt_mutex

//code path:include/linux/spinlock_type.h
#ifndef CONFIG_PREEMPT_RT/* Non PREEMPT_RT kernels map spinlock to raw_spinlock */
typedef struct spinlock {union {struct raw_spinlock rlock;...
#else /* !CONFIG_PREEMPT_RT *//* PREEMPT_RT kernels map spinlock to rt_mutex */
#include <linux/rtmutex.h>typedef struct spinlock {struct rt_mutex_base	lock;
...

事实上,不止spinlock, 许多其他锁在PREEMPT_RT中技术实现,底层都是rt_mutex,比如local_lockrwlock_t


本作品采用 CC BY-NC-SA 4.0 协议

http://www.jsqmd.com/news/739155/

相关文章:

  • Helm Dashboard:Kubernetes包管理的可视化驾驶舱
  • CVE-2026-31431 PoC(含C代码的PoC)
  • 抽屉深处翻出的京东e卡,我是这样处理的 - 抖抖收
  • 从手动排版到一键生成:桌游设计师的卡牌制作效率革命
  • 麒麟KYLINOS系统盘空间告急?别慌!手把手教你用LVM在线扩容(附详细命令与避坑点)
  • Scroll Reverser:macOS多设备滚动方向终极解决方案
  • csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
  • 跨平台项目中QString 与 非Qt 跨平台动态库在字符集上的一个实用的互操作约定.
  • Taotoken API Key 的精细化管理与访问审计实践分享
  • 别再死记硬背了!AutoSar RTE里S/R Port的显式和隐式,用这个比喻一下就懂了
  • 2026压力传感器行业排名推荐之选 广东犸力品牌值得信赖 - 速递信息
  • 让旧款iOS设备重获新生:Legacy-iOS-Kit终极指南
  • spring boot集成redis缓存
  • 喜马拉雅VIP音频下载终极指南:3步实现付费内容本地化
  • OpenCore完整指南:专业硬件兼容性与系统引导解决方案
  • 魔兽争霸3终极优化神器:WarcraftHelper让你的经典游戏焕发新生
  • Figma中文插件:让全球设计工具说中文的智能本地化解决方案
  • 3年踩坑总结:工业现场Python点云处理必避的6个“反模式”(含YOLOv8+PointPillars融合部署避坑清单)
  • 华为光猫配置解密工具:AES算法实现与模块化架构设计深度解析
  • 京东e卡回收实测:会员到期后的处理方案 - 抖抖收
  • Taotoken用量看板如何帮助个人开发者监控API消耗
  • 3步掌握GlosSI控制器映射:解锁全平台游戏控制优化终极方案
  • 抖音视频怎么保存到相册?抖音视频保存到相册的方法汇总,2026实测有效 - 科技热点发布
  • tfstk最新算法
  • TaleStreamAI:AI小说推文全自动工作流技术解析与实战指南
  • 终极魔兽争霸3优化指南:告别卡顿,畅享144Hz流畅体验
  • 导师不会告诉你的7个AI写论文神器,10分钟生成5000字! - 麟书学长
  • 02 下一个更大元素 单调栈
  • MTKClient终极指南:联发科设备刷机救砖的完整解决方案
  • 如何安装Competitive Companion:编程竞赛选手的终极效率工具指南