gpt4 book ai didi

linux - 在 Linux 内核中,为什么不能在 bottom half 获取互斥量?

转载 作者:IT王子 更新时间:2023-10-29 00:32:32 24 4
gpt4 key购买 nike

我正在阅读 Linux 内核开发 并且对互斥量和信号量之间的差异感到困惑。

作者说:

A mutex cannot be acquired by an interrupt handler or bottom half

我知道互斥量可能会导致 sleep ,并且中断处理程序未在任何特定进程上下文中运行,因此不允许使用互斥量或信号量。但是 bottom half 可以用工作队列来实现,它可以休眠。

那么,为什么不能在下半部分获取互斥锁?这里关注的是简单性和效率还是其他?

最佳答案

Mutex/semaphore locking 可以休眠,但是 BHs 被设计成不休眠。 Softirqs 在很多地方被异步检查执行。例如,它们可以在您每次恢复 BH 时执行(如 spin_unlock_bh)。让这样的代码在互斥锁上休眠是一个非常糟糕的主意。如果您在持有 BH 自旋锁的同时休眠,您可能会导致其他 BH 代码休眠,甚至可能导致整个系统死锁。

从这个角度来看,工作队列被认为是 BH,它们在内核线程的上下文中运行,内核线程可以自由休眠。因此,互斥锁适用于工作队列,但不适用于 tasklet。

BH 是一个模糊的术语,我发现将 linux 内核视为具有三个执行上下文会很有帮助:用户(包括内核线程)、softirq 和 hardirq。可以使用 preempt_count 中的一组位来控制其中每一个的抢占。

关于linux - 在 Linux 内核中,为什么不能在 bottom half 获取互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13466941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com