spin_lock和mutex_lock期间的Linux内核抢占

时间:2011-07-02 05:54:20

标签: locking linux-kernel preemption

当内核空间中的进程持有spin_lock时,由于以下任何一种情况,该进程无法被抢占:

  1. 当流程的时间片耗尽时
  2. 当高优先级进程变为可运行时
  3. 发生中断时
  4. 但是,如果处理器阻塞,休眠或显式调用schedule(),则该过程可以产生处理器。我的理解是否正确?

    当内核空间中的进程持有mutex_lock时,由于上面列出的条件为1,2和3,该进程可以被抢占。

1 个答案:

答案 0 :(得分:18)

自旋锁的当前实现使用两个完全独立的机制来确保互斥,一个用于处理处理器间排除,另一个用于处理本地处理器线程和中断处理程序。

  • 有spin_lock本身只能在两个或多个处理器内核之间提供互斥锁。任何处理锁定自旋锁的处理器基本上都会被卡住,直到另一个处理器释放它。自旋锁在单处理器系统上没有用处 - 除了增加完全死锁的可能性 - 因此通常在内核编译时删除。

  • 为了提供本地处理器互斥,spin_lock()调用preempt_disable()(在抢占式调度系统上)以防止任何其他线程在锁定时运行;类似地,spin_lock_irqsave()也相当于local_irq_save()来禁止中断,以防止在本地处理器上运行其他任何东西。

从上面可以明显看出,使用旋转锁可能会使整个机器变形,因此旋转锁只能在很短的时间内使用,你不应该做任何可能导致重新安排的事情。 / p>

使用mutex_lock的情况完全不同 - 只有尝试访问锁的线程受到影响,如果线程遇到锁定的互斥锁,则会发生重新安排。因此,mutex_locks不能用于中断(或其他原子)上下文。