锁定 – 在Linux内核抢占spin_lock和mutex_lock

前端之家收集整理的这篇文章主要介绍了锁定 – 在Linux内核抢占spin_lock和mutex_lock前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当内核空间中的进程持有spin_lock时,由于以下任一条件,该进程不能被抢占:

>当过程的时间片耗尽时
>当高优先级进程变得可运行时
>发生中断时

但是,如果处理器阻塞,睡眠或显式调用schedule(),则该进程可能会产生处理器.我的理解是否正确?

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

解决方法

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

>有spin_lock本身只是在两个或多个处理器内核之间提供互斥体.遇到锁定旋转锁的任何处理器基本上被卡住,直到另一个处理器释放它.旋转锁在单处理器系统上不起作用,除了增加总死锁的机会,因此通常在内核编译时会被删除.
>为了提供本地处理器互斥体,spin_lock()调用preempt_disable()(在优先调度系统上),以防止任何其他线程在锁定时运行;同样,spin_lock_irqsave()也等效于local_irq_save()来禁用中断,以防止在本地处理器上运行的其他任何东西.

从上面可以明显看出,使用旋转锁可能会使整个机器发胶,因此旋转锁只能在很短的时间内使用,您不应该在持有锁时可能会导致重新计划.

mutex_lock的情况是完全不同的 – 只有尝试访问锁的线程才会受到影响,如果某个线程遇到锁定的互斥体,则会发生重新计划.为此,mutex_locks不能在中断(或其他原子)上下文中使用.

猜你在找的Linux相关文章