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)启用完全抢占内核(Preemptible Kernel)打补丁(如PREEMPT_ RT)修改内核为完全可抢占模式,允许在内核任意位置被高优先级任务 抢占。 启用完全抢占内核(Preemptible Kernel)是提升系统响应能力的关键技 术手段。通过为Linux内核打上实时补丁(如PREEMPT_RT),可以将标准 内核修改为完全可抢占模式。这种模式下,内核在执行过程中几乎任意位 置(除极少数不可中断的原子上下文,如中断处理、自旋锁保护区域等) 都可以被更高优先级的任务立即抢占。这种机制显著降低了任务调度延迟 ,使得高优先级任务能够获得毫秒级甚至微秒级的响应速度。 PREEMPT_RT补丁通过重构内核锁机制、将自旋锁替换为可睡眠的互斥锁、 将中断处理线程化等技术手段,大幅增加了内核的可抢占点。相比标准 Linux内核的三种抢占模式(无抢占、自愿抢占完全抢占),经过 PREEMPT_RT补丁修改后的内核实现了真正的全内核范围抢占。这种改进特 别适用于工业控制、自动驾驶、高频交易等对延迟敏感的领域,在这些场 景中,即使是几十微秒的延迟差异也可能导致严重后果 (2)配置抢占模式 通过内核编译选项调整抢占策略: CONFIG_PREEMPT_NONE:无主动抢占,吞吐量优先。 CONFIG_PREEMPT_VOLUNTARY:插入主动让步点,平衡吞吐延迟。 CONFIG_PREEMPT:允许内核抢占,适用于桌面实时性需求。
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值