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

【OS】互斥锁和自旋锁的区别

阻塞行为

互斥锁:加锁失败时,线程会进入阻塞状态,释放CPU资源,由操作系统调度其他线程执行。

自旋锁:加锁失败时,线程会忙等待,持续循环检查锁的状态,不释放CPU资源。

适用场景

互斥锁:适用于临界区资源访问时间较长或存在阻塞操作的情况,如文件I/O、数据库操作等。

自旋锁:适用于临界区资源访问时间短,且线程竞争不激烈的情况,如内核态驱动程序开发、轻量级数据结构保护等。(临界区资源不是指RTOS的进入临界区,那个是需要关中断的)

性能特点

互斥锁:在锁竞争激烈时,通过让线程睡眠来减少CPU浪费,但上下文切换会带来额外开销。

自旋锁:避免了上下文切换的开销,但在高竞争下可能导致CPU资源浪费。

底层实现

互斥锁:内核调度机制+等待队列。

自旋锁:原子操作+忙等待。

死锁风险

互斥锁:虽然也存在死锁风险,但相对较低,因为线程会睡眠,其他线程有机会获取锁。

自旋锁:更容易出现死锁,因为不会释放CPU资源,如果持有锁的线程进入死循环,其他线程将无法获取锁。

使用环境

互斥锁:适用于用户态程序,可处理长时间持有锁的情况。

自旋锁:常用于内核态,因为内核中线程不能轻易阻塞。此外,在中断处理程序中也只能使用自旋锁,用互斥锁的代码可能导致睡眠,中断中不能睡眠。

补充:

读写锁基于互斥锁,特点是读可以多线程读,写只能一个线程写,同时读和写是互斥的。

读写锁、互斥锁、自旋锁都是悲观锁。悲观锁就好比云文档不能多人同时编辑,想要多人同时编辑就要使用乐观锁。乐观锁就是先改共享资源,改完再判断有没有别人修改,如果发生冲突再说,一般用于冲突概率很低的场景,比如SVN和Git这种应用。

自旋锁的死锁风险:
  1. 进入临界区后不能调用可能引起系统休眠的函数
  2. 临界区的代码不能被中断函数重入调用

如果进入临界区后睡眠,会引起这样的问题,如下图

如果临界区的代码在执行的时候,中断重入调用,如下图

上面两种情况下,都出现一个问题,就是在临界区运行时,还没有来得及释放锁,当前进程被动释放了CPU的使用权,然后下次「可能是中断处理函数,可能是CPU调度的其他线程」再进来的时候,情况就会比较复杂,因为之前的程序一直没有释放,导致锁一直获取失败,失败后又一直在等待,而且永远等不到锁的释放,就会导致死锁了。

互斥锁死锁风险:
  1. A等待B,B等待C,C等待A
  2. 互斥锁依赖线程调度,在中断中使用互斥锁,如果加锁失败就会系统死锁,卡在中断里。所以FreeRTOS只提供了在中断条件下的二值信号量函数,比如xSemaphoreTakeFromISR,不支持阻塞时间。
http://www.jsqmd.com/news/650841/

相关文章:

  • 慕课助手终极指南:5分钟学会用智能插件轻松完成在线课程
  • AI也有两幅面孔?复旦等最新研究:高压之下大模型集体变脸
  • 从架构到实现:基于FPGA与AD7768-4的高精度同步数据采集系统设计
  • 终极指南:使用SMUDebugTool深度优化AMD Ryzen处理器性能
  • 微服务治理陷阱:从100个崩溃案例总结的熔断机制
  • Arduino IDE串口监视器与绘图器:5大核心功能详解与实战指南 [特殊字符]
  • 5步掌握ROFL播放器:从英雄联盟回放文件到深度分析实战指南
  • 4diacIDE IEC61499 开发环境编译实战:从源码到可执行文件的完整指南
  • 脑机接口:从“意念控物”到“大脑装修”,我们离未来还有多远?
  • 新手避坑指南:用PHPStudy搭建DVWA靶场时,80端口被占用的3种解决方法
  • 有实力的数字资产遗产继承纠纷明星律师事务所哪家口碑好 - mypinpai
  • 自动驾驶感知实战:如何用高精地图给红绿灯检测算法‘开天眼’?
  • 百度网盘秒传脚本深度解析:三步实现永久文件分享的创新革命
  • Zed 的一个“隐藏彩蛋“:复制代码居然能自动去缩进?
  • 避开401和403:天地图API密钥在QGIS中配置的完整避坑指南
  • 【研报315】2026年无人配送行业报告:出货量爆发、商业模式成熟、政策全面放开
  • 如何选择气动道岔加工厂,研发能力强、工艺精湛的厂推荐 - myqiye
  • 【物联网 · 实战】ESP8266智能配网进阶:告别硬编码,Blinker一键连接新Wi-Fi
  • 别再一条条插数据了!用pymysql的executemany()批量操作,让你的Python脚本快100倍
  • Gemini 应用登陆 Mac:免费下载,开启快捷集成的桌面 AI 体验!
  • 企业数字化转型中的技术架构演进路径与方法论
  • 3步掌握TurboVNC:高性能远程图形渲染的终极部署指南
  • 2026年遵义烧机油治理与汽车美容贴膜:底盘维修深度横评指南 - 精选优质企业推荐榜
  • 渗透写ssh公钥证书登录
  • 别再手动刷新了!用QtChart+QTimer实现实时数据流曲线(附完整源码)
  • W25QXX系列选型指南:从W25Q80到W25Q256的5个关键参数对比(附典型电路)
  • 开超市做门头都需要注意那几点
  • AI 1M 上下文时代,你的 session 管理正在悄然决定编码天花板
  • 鑫豪迈基本信息大揭秘,客户群体广泛度究竟如何 - 工业品网
  • 如何快速掌握Common Voice:面向开发者的终极实战指南