【发布时间】:2016-05-02 18:03:54
【问题描述】:
我对linux内核中的同步有一点疑问,即在中断上下文模式和进程上下文之间适合什么样的锁定技术来保护临界区。
在此先感谢.....
【问题讨论】:
-
我不具体了解 Linux,但通常对于大多数操作系统来说,如果中断处理程序将高于当前优先级的线程设置为就绪,则会设置一个“需要调度”标志。在这种情况下,中断处理程序通过调度程序退出(用于上下文切换),而不是仅仅返回。为了处理嵌套中断,还有一个标志用于跟踪哪个中断是初始中断,因此只有初始中断可选地通过调度程序退出(嵌套的中断只会返回)。
-
要记住的重要一点是中断处理程序不能休眠;它没有任务上下文。因此,如果您需要将资源与中断处理程序同步,则不能使用互斥锁或信号量(它们可能会休眠);它必须是自旋锁或等效的。这当然意味着你不应该长时间持有锁(并且你不能在任务上下文中做任何可能在持有它时阻塞的事情)。
-
嗯,您当然可以将单位发布到信号量。
-
只是为了理解您的问题,您是否尝试同步对可以在进程上下文和中断上下文中访问的资源的访问?如果是,您是否编写了一些代码。你能发布代码来显示你正在尝试做什么。因为,在提出解决方案之前可能需要研究很多事情。
-
嗨 Vivek,我在采访中被问到这个问题,我已经向他解释说,自旋锁是正确的选择,而不是互斥锁和信号量,但他没有意识到我已经在 SO 中发布以获得更多说明。这个场景就像“你有关键代码将在内核线程和一些 ISR 之间访问,如何避免数据损坏,哪种同步技术会有所帮助”
标签: c linux-kernel operating-system synchronization interrupt-handling