需要知道的spinlock

linux锁机制:ticket spinlock spinlock spinlock即自旋锁,在linux内核中广泛运用的底层同步机制,相对于可睡眠锁,spinlock采用spin的方式获取锁(busy-wait), 避免了context_switch的开销,在短暂临界区访问场景下速度明显提升,性能更高,对memory等critical section互斥访问,发挥着重要作用。 spinlock对内核的数据安全性和并发性能有很大的... 阅读详情

spin_lock_irqsave禁止的是不是当前cpu的中断?还是说所有的中断?

是的,spin_lock_irqsave() 禁止的是当前(本地)CPU 的中断。它不会影响其他 CPU 核心的中断状态。

这是一个非常关键的区别,理解了这一点就理解了 SMP(对称多处理)系统中中断和锁的核心设计理念。


详细解释

1. 作用范围:本地 CPU
  • spin_lock_irqsave() 是一个 “本地操作”。它只对执行这条指令的当前 CPU 核心起作用。
  • 当某个 CPU 核心调用这个函数时,它会在自己的核心上执行一条类似 CLI(Clear Interrupt Flag)的指令,禁用该核心对中断的响应。
  • 其他 CPU 核心完全不受影响,它们的中断状态保持不变,可以正常地响应硬件中断和处理软中断。
2. 为什么只禁用本地中断?

这样设计的原因是基于一个重要的结论:在 SMP 系统中,自旋锁提供保护的核心是防止不同 CPU 核心之间的并发访问,而本地中断禁用提供保护的核心是防止同一 CPU 核心上的硬中断与进程上下文之间的并发访问。

它们的分工如下:

  • 自旋锁 (spinlock):解决的是 CPU 与 CPU 之间的竞争条件。当一个 CPU 持有锁时,其他 CPU 如果想获取锁,就会自旋等待。
  • 中断禁用 (irqsave):解决的是 CPU 与自身的竞争条件。防止当前 CPU 上的中断处理程序打断了正在持有锁的进程上下文代码,从而形成请求同一锁的死锁(即你上一个问题描述的场景)。

下图清晰地展示了 spin_lock_irqsave 如何通过分工协作来实现安全保护:

线程调用 spin_lock_irqsave
步骤 1: 禁用本地CPU中断
防止自身被中断抢占形成死锁
步骤 2: 获取自旋锁(spin_lock)
防止其他CPU核心访问临界区
安全进入临界区
同时防范了本地中断和外部CPU的干扰
线程调用 spin_unlock_irqrestore
步骤 1: 释放自旋锁
允许其他CPU竞争锁
步骤 2: 恢复本地CPU中断状态
允许本地CPU再次响应中断

举例说明

假设一个双核系统:CPU0 和 CPU1。

  1. CPU0 上运行着一个内核线程,它调用了 spin_lock_irqsave(&my_lock, flags)。
    • 在 CPU0 上:中断被禁用。my_lock 被标记为已由 CPU0 持有。
  2. 此时,一个硬件中断(例如网络中断)发生了。
    • 这个中断可以被路由到 CPU1 去处理。
    • CPU1 的中断是启用的,所以它正常地接收并处理这个中断。
    • 在这个中断处理程序中,如果它也尝试获取 spin_lock(&my_lock),它会发现锁被 CPU0 持有,于是 CPU1 会在不禁用自身中断的情况下开始自旋等待,直到 CPU0 释放锁。
  3. CPU0 上的线程继续执行,它不会被打断,因为它的本地中断是禁用的。
  4. CPU0 上的线程完成工作后,调用 spin_unlock_irqrestore(&my_lock, flags)。
    • my_lock 被释放。
    • CPU0 的中断被重新启用。
  5. 一直在自旋等待的 CPU1 的中断处理程序现在成功获取到锁,执行完它的工作后释放锁。

总结与对比

函数作用影响范围
spin_lock()仅获取自旋锁。防止其他 CPU 进入临界区。
spin_lock_irq()禁用本地CPU中断 + 获取锁。防止其他 CPU + 本地中断进入临界区。
spin_lock_irqsave()禁用本地CPU中断(并保存状态) + 获取锁。防止其他 CPU + 本地中断进入临界区。
spin_lock_bh()禁用本地CPU软中断 + 获取锁。防止其他 CPU + 本地软中断/tasklet进入临界区。

关键要点:

  • 中断禁用操作(irqsave, irq, bh)都是每CPU的,只影响执行操作的本地核心。
  • spin_lock_irqsave() 是 “本地中断禁用” 和 “全局自旋锁” 的组合。
  • 它解决了两种竞争:
    1. 进程上下文 vs 其他CPU的进程上下文(通过自旋锁解决)。
    2. 进程上下文 vs 本地CPU的中断上下文(通过禁用本地中断解决)。

所以,回到你的问题:spin_lock_irqsave 禁止的是当前CPU的中断,而不是所有中断。其他CPU依然可以正常处理中断,只是如果它们想获取同一把锁,就必须自旋等待。

SpinLock源码 一、概要 spinLock的基本原理是如果发现其他人锁着,就一直循环,知道其他人解锁后,再上锁。一般SpinLock适用于锁的时间很短的情况,通过不断判定是否可以加锁,避免适用Mutex这类操作系统锁带来不能锁定时的上下文切换。 二、实现源码 #pragma once #include <atomic> #include <thread> using namespace std; class SpinLock { private: atomic<bool> _flag; 阅读详情

相关推荐

Linux内核中mutex,spinlock的使用

并发性的,在CPU1线程B获取锁B,同时想获取锁A,导致AB-BA死锁。锁的粒度:在大项目中,使用太少的锁是个问题。锁A发生在中断上下文中:如果中断发生,中断处理函数尝试获取锁A,导致死锁。因此,在中断上下文中获取的锁必须始终在禁用中断的情况下使用。mutex lock 是睡眠锁,在等待锁时将睡眠,再锁被释放后,内核唤醒等待的进程运行;此外,不可中断状态的睡眠更多一些,必须无限期阻塞等待,任务不能打断阻塞的等待。在人机交互应用程序中,一般的经验,通常应该将进程置于可中断的睡眠状态。

3843

spinlock 详解

在这篇文章中, 我将会介绍 Kernel 提供用来使用 spinlock 的 function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将所有 CPU 的中断 disable 这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使 spinlock 的 cost 再降低,进而使系统的效能更好... 前言 在 Linux Kernel 里

firetaker的专栏 954

Molflow新手必看:Facet基础操作全解析(从2D建模到3D拉伸)

本文为Molflow新手提供了Facet基础操作的全面解析,涵盖从2D图形创建到3D模型拉伸的完整流程。详细介绍了Facet作为几何建模基石的核心概念、顶点编辑、布尔运算以及拉伸、放样等关键操作,并深入讲解了如何为其配置物理参数以实现真空系统的蒙特卡洛模拟。

prometheus9mon的博客 417

spinlock 简介

<br /><br />在這篇文章中,我將會介紹 Kernel 提供用來使用 spinlock 的 function。除此之外,我還會告訴各位,為何在 SMP 的環境裏,使用 spinlock 會比將所有 CPU 的中斷 disable 這個方法來的有效率,我也會告訴各位如何針對不同的使用需求,使 spinlock 的 cost 再降低,進而使系統的效能更好... <br />前言<br /><br />在 Linux Kernel 裏有著許多重要的資料結構,這些資料在作業系統的運作中扮演著舉足輕重的角色。

Full Stack Engineer 779

嵌入式Linux网络调试踩坑记:YT8531/YT8521 PHY驱动移植与设备树配置实战

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的实战经验。从网络不通的常见现象入手,详细介绍了驱动移植关键点、设备树配置详解及常见问题排查技巧,帮助开发者快速解决RGMII接口调试难题,提升嵌入式网络开发效率。

weixin_42525328的博客 444

从零开始掌握机械臂运动控制:原理、建模与实践

本文系统介绍了机械臂运动控制的核心原理与实践方法。从运动学与动力学建模的基础理论出发,详细解析了经典PID控制与现代MPC(模型预测控制)算法的应用,并通过ROS与MATLAB仿真案例,指导读者从零开始实现机械臂的轨迹规划与精准控制,为工业自动化应用提供完整的技术路径。

weixin_29099217的博客 564

宋宝华: 几个人一起抢spinlock,到底谁先抢到?

天问公平在哪里?几个人一起抢spinlock,到底谁先抢到呢?这是一个问题。几个人一起去银行柜台,到底谁先被服务到呢?这是一个问题。闹地不好就要出问题。这个问题就是公平的...

Linux阅码场 2万+

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3287

Linux 内核自旋锁spinlock(二)--- ticket spinlock

Linux 内核自旋锁spinlock--- ticket spinlock简介。

小立仔 1708

Qt和FFmpeg的视频压缩工具

m_progressDialog = new QProgressDialog("正在压缩视频...", "取消", 0, 100, parent);QString file = QFileDialog::getOpenFileName(this, "选择视频文件", "",QString file = QFileDialog::getSaveFileName(this, "保存压缩文件", "",QMessageBox::warning(parent, "错误", "请设置输入和输出文件路径");

寒寒豆豆软件公司的博客 103

AI视频生成模型训练:从数据准备到部署全流程

咱们这次的目的就像是要建造一座超级厉害的AI视频生成魔法城堡。范围呢,就是从收集建造城堡的材料(数据准备)开始,到把城堡搭建起来(模型训练),再到让城堡能供大家使用(模型部署),涵盖了整个过程的方方面面。接下来我们会先给大家介绍一些重要的术语,就像认识冒险途中的关键道具一样。然后引入一个有趣的故事,带大家进入AI视频生成的奇妙世界,解释核心概念以及它们之间的关系。接着会详细讲解核心算法原理、数学模型和公式,还会有项目实战,带大家亲自体验代码的魅力。

小白菜的博客 399

Spinlock 简介(转)

http://eagletff.blog.163.com/blog/static/1163509282010791954994/ 在这篇文章中,我将会介绍 Kernel 提供用来使用 spinlock 的 function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将所有 CPU 的中断 disable 这个方法来的有效率,我也会告诉各位怎么针对不同的使用需

WINGCREATE的专栏 1223

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4327

内核同步机制之spinlock介绍

内核同步机制--spinlock简介

qq_40352506的博客 4050

LeRobot 入门教程(三)在仿真环境和自定义机器人上部署 LeRobot

本教程详细介绍了基于真实世界机器人和仿真环境的模仿学习实现方法,涵盖数据采集、训练策略和评估全流程。在真实机器人部分,重点讲解了远程操作设置、摄像头配置、数据集记录与管理技巧、策略训练(支持GPU/MPS设备)以及模型评估。仿真环境部分则演示了gym-hil的安装使用、模拟数据采集和策略训练。此外,教程还提供了自定义机器人集成指南,包括电机选择、接口继承、传感器/动作特征定义、连接管理和校准配置等核心步骤。所有方法均支持HuggingFace数据集中心和Weights & Biases工具链,为机器

2506_90492529的博客 2400

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

static DEFINE_SPINLOCK(synctime_lock);

自旋锁

qq_41483419的博客 463

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spinlock简介

作者 : cjc86在 这篇文章中,我将会介绍 Kernel 提供用来使用 spinlock 的 function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将所有 CPU 的中断 disable 这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使 spinlock 的 cost 再降低,进而使系统的效能更好... 前言在 Linux Ker

YUYOUFU的专栏 1099

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spinlock

 在這篇文章中,我將會介紹 Kernel 提供用來使用 spinlock 的 function。除此之外,我還會告訴各位,為何在 SMP 的環境裡,使用 spinlock 會比將所有 CPU 的中斷 disable 這個方法來的有效率,我也會告訴各位如何針對不同的使用需求,使 spinlock 的 cost 再降低,進而使系統的效能更好...前言在 Linux Kernel 裡有著許多重要的資料結

brfeng的专栏 811

Spinlock 简介

在这篇文章中,我将会介绍 Kernel 提供用来使用 spinlock 的function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将所有 CPU 的中断 disable这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使 spinlock 的 cost 再降低,进而使系统的效能更好... 前言 在Linu

Joseph Zhong 354

spinlock用法总结

Spinlock的目的是用来同步SMP中会被多个CPU同时存取的变量。在Linux中,普通的spinlock由于不带额外的语义,是用起来反而要非常小心。 在Linux kernel中执行的代码大体分normal和interrupt context两种。tasklet/softirq可以归 为normal因为他们可以进入等待;nested interrupt是interrupt context的一

qq_24521983的博客 4115

spinlock mutex semaphore rwlock

<br /><br />spinlock mutex语义上是一样的,都是对一临界区加锁保护,<br />区别是mutex得不到锁会睡眠,因此不能在中断上下文中使用。<br />另外,解锁的一定是上锁的那个 semaphore 得不到锁会睡眠,也不能用在中断中, 上锁的不一定负责解锁 。<br />rwlock 很好理解了,可多个读,只有一个写者,同样会引起睡眠<br />最重要的就是只有spinlock 可以用在中断上下文中.<br /><br />至于wait_queue,不是同步手段,是内核管理slee

test 2983

RK3576 I3C实战指南:破除10倍速误区与DTS配置避坑

I3C(Improved Inter-Integrated Circuit)是一种面向现代嵌入式系统的智能串行总线协议,旨在解决传统I2C在地址资源、轮询开销和动态拓扑管理上的结构性瓶颈。其核心原理并非单纯提升时钟频率,而是通过带内中断(In-Band Interrupt)、热加入(Hot-Join)和动态地址分配等机制实现低功耗、高响应的多设备协同。技术价值体现在显著降低CPU占用率、提升总线有效利用率,并原生支持多主仲裁与即插即用。典型应用场景包括工业传感器集群、边缘AI终端及可扩展物联网网关。本文聚焦

weixin_34060741的博客 341
上一篇: regmap的使用
下一篇: mb与使用场景
liveloading
博客等级 码龄7年 53粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值