linux与rt-linux关于spinlock的差异以及使用注意事项

1、spinlock由来

自旋锁:对共享资源的访问保护锁,使用“自旋”方式循环查询等待获取互斥锁。

在Linux中,有多套spinlock操作接口。但是,实现机制并不相同。
根据使用场景,实现机制可能是“自旋“,也可能不是”自旋”方式。
这些实现机制的共通特点是:以不产生调度的方式,获取互斥锁。
但是,在实时Linux(RtLinux)中,spinlock却是产生调度的。

2、spinlock用途

spinlock的不产生调度机制决定了用途:
1、对共享数据的访问操作时间一定要短。不同系统对实时性要求不同,这个时间要求有差异,应该控制在5us以内。
2、spinlock接口性能较高,适用在高频繁使用,但是冲突又少的场景。
3、spinlock一般作为系统基础接口,保护共享资源。例如,mutex中含有的基础变量的保护,需要使用spinlock接口。
与mutex的差异: 
mutex是以可产生调度的方式保护共享资源。当一方占用资源时,另一方可挂起等待,能够释放CPU资源。
mutex在单核、多核、普通Linux,RtLinux中,都能对共享资源保护,没有差异,接口统一。
mutex只能在线程上下文中,在允许调度的环境中才能使用。
spinlock可在中断、线程、单核、多核等场景中使用。在不同的配置下,实现方式不同,不同的场景需要选择不同的接口,在Linux中使用最为广泛。Spinlock使用场景宽泛,接口数量和使用限制多,容易导致错误,一定要注意。

3、spinlock在不同linux环境下的差异

接口linux单核linux多核rt-linux
spin_lock锁抢占锁抢占+自旋方式锁变量互斥量
spin_lock_irq锁中断+锁抢占锁中断+锁抢占+自旋方式锁变量互斥量
spin_lock_irqsave锁中断+锁抢占锁中断+锁抢占+自旋方式锁变量互斥量
spin_lock_bh锁软中断锁软中断+自旋方式锁变量锁软中断+互斥量
raw_spin_lock锁抢占锁抢占+自旋方式锁变量同linux单核或多核
raw_spin_lock_irq锁中断+锁抢占锁中断+锁抢占+自旋方式锁变量同linux单核或多核
raw_spin_lock_irqsave锁中断+锁抢占锁中断+锁抢占+自旋方式锁变量同linux单核或多核
raw_spin_lock_bh锁软中断锁软中断+自旋方式锁变量同linux单核或多核

3、spinlock使用规范

普通linux:
spin_lock:在线程间保持互斥保护
spin_lock_irq:  在线程间、以及线程、中断、软中断间保持互斥同步
Spin_lock_bh:  在线程间、以及线程和软中断间保持互斥同步
实时linux:
spin_lock: 在线程间保持互斥同步
spin_lock_irq:在线程间、以及线程、中断线程、软中断线程保持互斥同步
spin_lock_bh: 在线程间、以及线程和软中断线程保持互斥同步
raw_spin_lock_irq:在线程间、以及线程、中断、中断线程、软中断线程间保持互斥同步

`在spinlock的保护区内,不允许调用阻塞函数 ★★★★★``

4、哪些常用接口不能用于RT-LINUX中断上下文

完成量、schedule_work、wakelock、wakeup等因为接口中有spin_lock的操作,该操作在RT-LINUX上是阻塞接口,所以不能用于中断上下文。

转载于:https://blog.51cto.com/13824435/2131756

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的spinlock是一种自旋锁机制,用于保护对共享资源的访问,以防止同时访问导致的数据竞争问题。spinlock使用了一种称为自旋的技术,即当一个线程需要获取锁时,它会一直等待,直到锁被释放。这种等待是循环的,即线程会不断地检查锁的状态,直到锁被释放为止。 spinlock相比于传统的互斥量(mutex)和信号量(semaphore)等锁机制,具有更高的性能和灵活性。spinlock不需要使用内核调度器,因此不会产生额外的上下文切换开销。此外,spinlock可以用于任何需要保护的临界区代码,而不仅仅是用于进程之间的同步。 使用spinlock时,需要将其初始化为0,以便其他线程可以安全地访问共享资源。当一个线程需要获取锁时,它可以使用spin_lock函数来锁定spinlock。如果锁已经被其他线程占用,该线程将进入自旋状态,不断检查锁的状态。当该线程获取到锁时,它可以将共享资源置于临界区并执行相关操作。在操作完成后,该线程可以使用spin_unlock函数释放锁。 spinlock机制适用于一些简单的同步场景,例如在并发访问共享资源时保护临界区代码。然而,对于一些复杂的同步需求,可能需要使用更高级的同步机制,如读写锁(rwlock)或条件变量(condition variable)。 总之,spinlock是一种轻量级的自旋锁机制,适用于简单的同步场景,具有较高的性能和灵活性。它适用于任何需要保护的临界区代码,而不仅仅是用于进程之间的同步。在使用spinlock时,需要注意避免死锁和过度自旋等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值