这是一个场景。假设内核任务在禁用抢占的单处理器系统上运行。该任务获得自旋锁。现在它正在执行它的关键部分。这个时候,如果这个任务可用的时间片过期了,又要被调度出去怎么办?
- 是否
spin_lock
有防止这种情况发生的机制? - 可以排期吗?如果是,那么临界区会发生什么?
- 它可以被 IRQ 中断吗?(假设禁用抢占)
- 这种情况可行吗?换句话说,这种情况会发生吗?
从内核代码中,我了解到 spin_lock 基本上是nop
在禁用抢占的单处理器上。准确地说,它所做的只是barrier()
我理解它为什么是一个nop
(因为它是一个单处理器,并且在那一刻没有其他任务可以处理数据)但我仍然不明白它是如何不间断的(由于 IRQ 或调度)。我在这里想念什么?指向表明这一点的 Linux 内核代码的指针可能真的很有帮助。
我的基本假设:
32 位 Linux 内核