加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – Linux spin_lock与NT KeAcquireSpinLock

发布时间:2020-12-14 02:22:07 所属栏目:Windows 来源:网络整理
导读:从我可以收集到: NT的KeAcquireSpinLock相当于spin_lock_bh:一个将IRQL提升到DISPATCH_LEVEL,另一个屏蔽下半部分中断 – 功能相同.虽然NT变体保留了OldIrql,但Linux变体似乎并未在任何地方存储“wereInterruptsAlreadyMasked”.这是否意味着spin_unlock_bh
从我可以收集到:

> NT的KeAcquireSpinLock相当于spin_lock_bh:一个将IRQL提升到DISPATCH_LEVEL,另一个屏蔽下半部分中断 – 功能相同.虽然NT变体保留了OldIrql,但Linux变体似乎并未在任何地方存储“wereInterruptsAlreadyMasked”.这是否意味着spin_unlock_bh总是取消屏蔽它们?
> NT的KeAcquireInterruptSpinLock就像spin_lock_irqsave.

什么是相当于spin_lock的NT?

如果spin_unlock_bh总是取消屏蔽中断(在NT中说,总是将IRQL丢弃到< DISPATCH_LEVEL),这是否意味着spin_lock类似于KeAcquireSpinLockAtDpcLevel?

解决方法

当您知道没有中断或下半部分将争用锁时,可以使用原始spin_lock.通过避免中断屏蔽,可以减少中断延迟,同时仍然可以避免关键部分的互斥锁开销过短,从而导致旋转.

在实践中,它们似乎主要用于文件系统驱动程序之类的东西,用于锁定内部缓存结构,以及在持有锁时从不需要阻塞IO的其他东西.由于后半部分和驱动程序中断不会直接触及FS驱动程序,因此无需屏蔽中断.

我怀疑Windows等价物是CRITICAL_SECTION,或者NT内核API等价物;然而,与NT关键部分不同,Linux自旋锁在争用时不会回归到互斥锁;他们只是继续旋转.

并且,是的,spin_unlock_bh无条件地恢复了下半部分.您可以跟踪何时手动启用/禁用(因为您通常应该以相反的获取顺序释放锁定,这通常不是问题),或者只是求助于spin_lock_irqsave.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读