【问题标题】:How to provide synchronization between interrupt context and process context [closed]如何在中断上下文和进程上下文之间提供同步 [关闭]
【发布时间】:2016-05-02 18:03:54
【问题描述】:

我对linux内核中的同步有一点疑问,即在中断上下文模式和进程上下文之间适合什么样的锁定技术来保护临界区。

在此先感谢.....

【问题讨论】:

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

标签: c linux-kernel operating-system synchronization interrupt-handling


【解决方案1】:

hiya 根据定义解决方案,例如:信号量(或互斥体)、testandset 和 ofc 自旋锁提供对关键代码的保护: 它要么是通过保证原子操作(例如,意味着锁定将需要 1 个操作来完成并获取锁、诸如面包店协议之类的协议并禁用进程的抢占(这就是您想要的)-一旦锁定,其他人都无法输入那个关键代码(假设你使用了共享内存或类似的东西)所以即使有一个上下文切换并且两个线程一起运行,我们保证只有一个可以访问该代码,事情是假设所有线程使用该内存或 w/e 并有一个关键区域具有相同类型的锁定获取

有关自旋锁的更多信息(禁用 CPU 的窥视) 参考这个:http://www.linuxinternals.org/blog/2014/05/07/spinlock-implementation-in-linux-kernel/ 请注意,自旋锁会“忙于等待” - 意味着在启用预占并且您没有获取锁时,CPU 在无用循环中运行时“浪费”计算时间

你也可以直接使用 irq\preempt 命令,但这很危险 例如:

 preempt_enable()       decrement the preempt counter
 preempt_disable()      increment the preempt counter
 preempt_enable_no_resched()    decrement, but do not immediately preempt
 preempt_check_resched()        if needed, reschedule
 preempt_count()            return the preempt counter

因为我真的不知道你想要实现什么,所以很难具体说明并满足你的需求,但我真的很喜欢昏昏欲睡的信号量: http://www.makelinux.net/books/lkd2/ch09lev1sec4 与我提供的其他解决方案不同,它们不会进行忙碌等待,从而节省了计算时间。

我真的希望我在这方面有所帮助... gl!

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多