我最近阅读了5.5.2 (自旋锁和原子上下文)部分的LDDv3书:
在保持锁的同时避免睡眠可能更困难;许多内核函数都可以休眠,而且这种行为并不总是被很好地记录下来的。将数据复制到用户空间或从用户空间复制数据是一个明显的例子:所需的用户空间页面可能需要从磁盘中交换,然后才能继续复制,而且该操作显然需要休眠。几乎任何必须分配内存的操作都可以休眠;kmalloc可以决定放弃处理器,并等待更多的内存可用,除非明确告诉它不要这样做。睡眠可能发生在令人惊讶的地方;编写在spinlock 下执行的代码需要注意您称为的每个函数。
在我看来,自旋锁必须始终保持在尽可能短的时间内,而且我认为从零开始编写正确的自旋锁代码相对容易。
然而,假设我们有一个大项目,其中spinlocks被广泛使用。我们如何确保从由自旋锁保护的关键部分调用的函数永远不会休眠?
提前感谢!
发布于 2010-09-09 18:13:11
如何为内核启用“睡眠-内部-自旋锁检查”?当您运行make时,通常会在内核调试下找到它。您还可以尝试在代码中复制它的行为。
发布于 2010-09-15 16:17:49
在许多项目中,我注意到的一件事是,人们似乎误用了自旋锁,他们被使用,而不是应该使用的其他锁定原语。
linux自旋锁只存在于多处理器构建中(在单进程构建中,spinlock预处理器定义为空)自旋锁用于多处理器平台上的短持续时间锁。
如果代码不能提供自旋锁,它只会旋转处理器直到锁是空闲的。因此,在不同处理器上运行的另一个进程必须释放锁,或者可能由中断处理程序释放锁,但是等待事件机制是等待中断的更好方式。
irqsave原语是禁用/启用中断的一种整洁方式,这样驱动程序就可以锁定中断处理程序,但这只应该保持足够长的时间,以便进程能够更新与中断处理程序共享的一些变量,如果禁用中断处理程序,则不会调度。
如果需要锁定中断处理程序,请使用自旋锁和irqsave。
对于一般的内核锁定,您应该使用互斥/信号量api,如果需要,它将在锁上休眠。
要锁定在其他进程中运行的代码,请使用muxtex/信号量来锁定在中断上下文中运行的代码,使用irq /还原或spinlock_irq保存/恢复
若要锁定在其他处理器上运行的代码,请使用自旋锁,并避免长期持有锁。
我希望这能帮到你
https://stackoverflow.com/questions/3676777
复制相似问题