您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

自旋锁的底层实现

时间:2022-08-27 15:49:46  来源:今日头条  作者:余生做酒长醉不忧

简介自旋锁

“锁”的作用就是保护临界区资源,避免不同的CPU同时访问相同的变量(或中断与进程同时访问相同变量)。非原子变量的赋值,大多数都不是一个指令周期能完成的,试想如果CPU1将某变量刚更改了一半,CPU2正好就来读取了这个半成品变量,并基于此去做计算,可能会造成严重后果。

解决办法就是CPU1在改写这个变量前,先“加锁”;CPU2访问这个变量前也先加锁,但由于已经被加锁了,所以获取锁失败,CPU2原地等待锁释放;CPU1改写完变量后,“解锁”;CPU2获取到锁后加锁,然后访问变量,完成后解锁。

上面的“锁”可以是信号量、互斥锁、自旋锁等。本文的自旋锁(spinlock)与其它锁的最大不同,就是在等待锁释放的时候不会睡眠,而是在空转(自旋)。信号量和互斥锁在等待锁释放的时候,会进入睡眠。

不睡眠的好处是:可以在中断上下文运行;另外,对于很快就能获取到锁的场景,这种方式效率更高。

不睡眠的坏处是:如果等待锁释放的时间较长,则极其浪费CPU资源。

自旋锁在X86的代码实现

/******include/asm-i386/spinlock_types.h***/

typedef struct {
                unsigned int slock;
} raw_spinlock_t;
 #define __RAW_SPIN_LOCK_UNLOCKED { 1 }

/******include/asm-i386/spinlock.h***/

static inline void __raw_spin_lock(raw_spinlock_t *lock){
    asm volatile(
       // lock->slock减1
      1:LOCK_PREFIX decb %0
       //如果不为负.跳转到3f.3f后面没有任何指令,即为退出
      jns 3f
      //重复执行nop.nop是x86的小延迟函数
      2:rep nop
      cmpb $0,%0
      //如果lock->slock不大于0,跳转到标号2,即继续重复执行nop
      jle 2
      //如果lock->slock大于0,跳转到标号1,重新判断锁的slock成员
      jmp 1
      3:: "+m" (lock->slock) : : "memory");
}

在多处理器环境中 LOCK_PREFIX 实际被定义为 “lock”前缀。x86 处理器使用“lock”前缀的方式提供了在指令执行期间对总线加锁的手段。芯片上有一条引线 LOCK,如果在一条汇编指令(ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, XCHG)前加上“lock” 前缀,经过汇编后的机器代码就使得处理器执行该指令时把引线 LOCK 的电位拉低,从而把总线锁住,这样其它处理器或使用DMA的外设暂时无法通过同一总线访问内存

jns 汇编指令检查 EFLAGS 寄存器的 SF(符号)位,如果为 0,说明 slock 原来的值为 1,则线程获得锁,然后跳到标签 3 的位置结束本次函数调用。如果 SF 位为 1,说明 slock 原来的值为 0 或负数,锁已被占用。那么线程转到标签 2 处不断测试 slock 与 0 的大小关系,假如 slock 小于或等于 0,跳转到标签 2 的位置继续忙等待;假如 slock 大于 0,说明锁已被释放,则跳转到标签 1 的位置重新申请锁。



Tags:自旋锁   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
自旋锁的底层实现
简介自旋锁“锁”的作用就是保护临界区资源,避免不同的CPU同时访问相同的变量(或中断与进程同时访问相同变量)。非原子变量的赋值,大多数都不是一个指令周期能完成的,试想如果CPU...【详细内容】
2022-08-27  Search: 自旋锁  点击:(454)  评论:(0)  加入收藏
linux内核--自旋锁的理解
自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对于UP系统,自旋锁仅做抢占和中断操作,没有实现真正的“自旋”。如果配置了CONFIG_DEBUG_SPI...【详细内容】
2021-10-21  Search: 自旋锁  点击:(270)  评论:(0)  加入收藏
自己动手实现四种自旋锁
原始自旋锁最原始的自旋锁就是多个线程不断自旋,大家都不断尝试获取锁。看下面例子,主要看lock和unlock两个方法,Unsafe仅仅是为操作提供了硬件级别的原子CAS操作。对于lock方...【详细内容】
2020-08-20  Search: 自旋锁  点击:(413)  评论:(0)  加入收藏
详解linux多线程——互斥锁、条件变量、读写锁、自旋锁、信号量
x一、互斥锁(同步)  在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),...【详细内容】
2020-07-17  Search: 自旋锁  点击:(361)  评论:(0)  加入收藏
自旋锁、排队自旋锁、MCS锁、CLH锁
自旋锁自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。自旋锁适用于锁保护的临界区很小的情况,临...【详细内容】
2019-10-14  Search: 自旋锁  点击:(704)  评论:(0)  加入收藏
自旋锁的自旋是什么意思,底层原理又是什么?
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打...【详细内容】
2019-09-23  Search: 自旋锁  点击:(762)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条