多核自旋锁

多核情况下,任务间的数据同步需要用到自旋锁。

单核情况下只要简单的锁中断就可以。而多核情况下,锁中断只能关闭当前核的中断,而其他核还在运行,这就需要引入自旋锁来循环查询获取临界区所有权。

在多核多线程的情况下要保持数据的同步,需要引入称作Load-Link(LL)和Store-Conditional(SC)的操作,通常简称为LL/SC。

LL操作返回一个内存地址上当前存储的值,后面的SC操作,会向这个内存地址写入一个新值,但是只有在这个内存地址上存储的值,从上个LL操作开始直到现在都没有发生改变的情况下,写入操作才能成功,否则都会失败。

这是很多平台实现基本原子操作的基础。 对于ARM平台来说,也在硬件层面上提供了对LL/SC的支持,LL操作用的是LDREX指令,SC操作用的是STREX指令

 ldrex、strex 独占存储指令

pld 预加载指令

owner,next

owner指示自旋锁当前拥有者序号,next 表示当前请求线程的等待序号,

每次进入读取lock当前值并尝试next加一,通过LL/SC指令保证该值唯一;

如果local->next和lock->owner不等,则循环查询等待(自旋)。。。

每次释放锁时owner加一,指示下一个自旋等待线程(处理器)可以继续运行

spin锁是针对多核设计的。单核情况下锁中断就可以尝试进入临界区,但是多核情况下,锁中断只是锁定了当前核,其他核还在运行,所以需要自旋锁来作为一个可以进入临界区的flag,当多个核竞争进入一个 临界区时,自旋锁可以让没有得到锁的核心自选等待。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值