Linux kernel 互斥锁和自旋锁一起获得

Linux kernel 互斥锁和自旋锁一起获得,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我听说可以同时获得互斥锁和自旋锁来创建一个关键部分,如下所示:- 互斥锁---->spinlock-----临界区---spinlock---->mutex\u解锁 这种理解正确吗?这在内核中的何处使用?有人能解释一下设备驱动程序中的真实场景吗 如果先获取自旋锁,然后获取互斥锁,会发生什么情况 spinlock-->mutex\u lock-----临界段….mutex\u unlock---->spinlock 允许这样做吗?如果不是,那么内核在这种情况下如何运行。这两种机制都用于互斥(即保护

我听说可以同时获得互斥锁和自旋锁来创建一个关键部分,如下所示:-

互斥锁---->spinlock-----临界区---spinlock---->mutex\u解锁

这种理解正确吗?这在内核中的何处使用?有人能解释一下设备驱动程序中的真实场景吗

如果先获取自旋锁,然后获取互斥锁,会发生什么情况

spinlock-->mutex\u lock-----临界段….mutex\u unlock---->spinlock


允许这样做吗?如果不是,那么内核在这种情况下如何运行。

这两种机制都用于互斥(即保护“关键部分”)。因此,对于同一个关键部分,通常不需要同时使用这两种方法。然而,这两种机制通常用于不同的情况

自旋锁用于非常短期地访问共享数据。例如,如果需要将某个项目添加到其他线程可能也要添加(或删除)的链接列表中,则可以使用自旋锁来确保列表指针不会损坏

互斥锁通常用于持续时间较长的关键部分,尤其是当您使用的某些东西可能会休眠时(例如,访问可能导致页面错误的用户空间内存)。另外,如果其他线程已经拥有锁,那么试图获取互斥锁的线程可能会进入睡眠状态。由于在持有自旋锁时决不能执行任何可能会睡眠的操作,因此在持有自旋锁时无法获取互斥锁。(但请注意,linux互斥体实际上包含一个自旋锁,用于同步对互斥体数据结构的访问。)

OTOH,在持有互斥锁的同时获得自旋锁是完全可以的。(例如,您可以使用它来确保在修改链表时,即使是在另一个CPU上运行的中断处理程序也无法访问链表。)


请参阅此链接,以了解为什么在持有自旋锁时禁用抢占,以及为什么在持有自旋锁时也经常禁用中断

首先做一些研究来了解这些东西是什么。例如,我了解互斥锁和自旋锁的基本知识。请参考我的博客帖子-。虽然这个问题看起来有点古怪,但这与我想研究的实际例子更相关。我无法从Russel King的内核锁定文档中找到答案。