【发布时间】:2011-04-10 06:12:51
【问题描述】:
我最近阅读了 LDDv3 书籍的5.5.2(自旋锁和原子上下文)部分:
在持有锁时避免睡眠可能会更加困难;许多内核函数可以休眠,而这种行为并不总是有据可查。将数据复制到用户空间或从用户空间复制数据就是一个明显的例子:在复制可以继续之前,可能需要从磁盘换入所需的用户空间页面,并且该操作显然需要休眠。几乎任何必须分配内存的操作都可以休眠; kmalloc 可以决定放弃处理器,并等待更多内存可用,除非明确告知不要这样做。睡眠可能发生在令人惊讶的地方;编写将在自旋锁下执行的代码需要注意您调用的每个函数。
我很清楚,自旋锁必须始终保持尽可能短的时间,而且我认为从头开始编写正确的使用自旋锁的代码相对容易。
但是,假设我们有一个广泛使用自旋锁的大型项目。 我们如何确保从受自旋锁保护的关键部分调用的函数永远不会休眠?
提前致谢!
【问题讨论】:
标签: linux-kernel sleep atomic spinlock