linux自旋锁 原理图,自旋锁原理分析

本文将要为您介绍的是自旋锁原理分析,具体操作过程:1. 概念

自旋锁的目的是在短期间内进行轻量级的锁定,解决对某项共享资源的互斥使用,在等待锁重新可用期间进行自旋,所以自旋锁不应该被持有时间过长,如果需要长时间锁定的话,推荐使用信号量。实际操作的数据结构如下:

cda2e563199c5d4da8dee755dac79283.png

2. 获取锁

最终执行的代码是体系结构相关的自旋锁实现:arch_spin_lock。

806141f65ccb6e983d63d6e7e42910c7.png

3. 代码分析

static inline void arch_spin_lock(arch_spinlock_t *lock)

{

unsigned long tmp;

u32 newval;

arch_spinlock_t lockval;

// 处理器通知内存系统将对某个地址的内存进行读写

prefetchw(&lock->slock);

// 以独占的方式对 lock->tickets.next 执行 +1 操作

__asm__ __volatile__(

"1: ldrex %0, [%3]n"

" add %1, %0, %4n"

" strex %2, %1, [%3]n"

" teq %2, #0n"

" bne 1b"

: "=&r" (lockval), "=&r" (newval), "=&r" (tmp)

: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)

: "cc");

// 判断是否轮到自己拥有自旋锁

while (lockval.tickets.next != lockval.tickets.owner) {

// 将当前核心挂起等待其他核心发送信号,也就是等 SEV 指令

wfe();

// 读取自旋锁中的 lock->tickets.owner

lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner);

}

// 数据同步

smp_mb();

}

4. 释放锁

最终执行的代码是体系结构相关的自旋锁实现:arch_spin_unlock。

aa406c90c1b884e52f43904064da13c1.png

5. 代码分析

static inline void arch_spin_unlock(arch_spinlock_t *lock)

{

// 数据同步

smp_mb();

// 将自旋锁交给下一个使用者

lock->tickets.owner++;

// 先进行数据同步,然后给其他核心发信号

dsb_sev();

}

6. 总结

自旋锁底层实现依赖于体系结构相关的汇编指令,在进行自旋锁操作时,使用独占指令LDREX/STREX;在自旋时使用指令WFE将当前核心挂起,等待被唤醒;当核心在释放自旋锁时,使用SEV指令通知其他所有核心。自旋锁原理分析就为您介绍到这里,感谢您关注懒咪学编程c.lanmit.com.

本文地址:https://c.lanmit.com/czxt/Linux/119026.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值