在非preemtive linux内核上锁定 – spin_lock

在非preemtive linux内核上锁定 – spin_lock,第1张

概述我在一个具有1个CPU和非预处理 Linux内核(2.6.x)的系统上读到,spin_lock调用相当于一个空调用,因此以这种方式实现. 我无法理解:它不应该相当于在互斥上睡一觉吗?即使在非preemtive内核上,中断处理程序仍然可能被执行,或者我可能会调用一个将原始线程置于休眠状态的函数.因此,空的spin_lock调用是“安全的”并不是真的,如果它被实现为互斥锁的话. 有没有我得不到的东西? 我在一个具有1个cpu和非预处理 Linux内核(2.6.x)的系统上读到,spin_lock调用相当于一个空调用,因此以这种方式实现.

我无法理解:它不应该相当于在互斥上睡一觉吗?即使在非preemtive内核上,中断处理程序仍然可能被执行,或者我可能会调用一个将原始线程置于休眠状态的函数.因此,空的spin_lock调用是“安全的”并不是真的,如果它被实现为互斥锁的话.

有没有我得不到的东西?

解决方法 引自“linux设备驱动程序”,Jonathan Corbet,Alessandro Rubini和Greg Kroah-Hartman:

If a nonpreemptive uniprocessor system ever went into a spin on a
lock,it would spin forever; no other thread would ever be able to
obtain the cpu to release the lock (because it Couldn’t yIEld).
Because of this,spinlock operations on uniprocessor systems without
preemption enabled are optimized to do nothing,with the exception of
the ones that change the IRQ masking status (in linux,that would be
spin_lock_irqsave()). Because of preemption,even if you never
expect your code to run on an SMP system,you still need to implement
proper locking.

如果您对在中断上下文(硬件或软件)中运行的代码可以使用的自旋锁感兴趣,则必须使用一种禁用中断的spin_lock_ *形式.如果在您进入关键部分时中断到达,则不会这样做会使系统死锁.

总结

以上是内存溢出为你收集整理的在非preemtive linux内核上锁定 – spin_lock全部内容,希望文章能够帮你解决在非preemtive linux内核上锁定 – spin_lock所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1028965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存