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

锁定 – 在Linux内核抢占spin_lock和mutex_lock,第1张

概述当内核空间中的进程持有spin_lock时,由于以下任一条件,该进程不能被抢占: >当过程的时间片耗尽时 >当高优先级进程变得可运行时 >发生中断时 但是,如果处理器阻塞,睡眠或显式调用schedule(),则该进程可能会产生处理器.我的理解是否正确? 当内核空间中的一个进程持有一个mutex_lock时,由于上面列出的条件为1,2和3,该进程可以被抢占. 旋转锁的当前实现使用两个完全独立的机制来 当内核空间中的进程持有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内核抢占spin_lock和mutex_lock全部内容,希望文章能够帮你解决锁定 – 在Linux内核抢占spin_lock和mutex_lock所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存