【问题标题】:Linux Kernel - Can I lock and unlock Spinlock in different functions?Linux Kernel - 我可以在不同的功能中锁定和解锁 Spinlock 吗?
【发布时间】:2013-11-14 17:16:09
【问题描述】:

我是内核编程和锁编程的新手。

在不同功能中锁定和解锁自旋锁是否安全?我这样做是为了同步代码流。

另外,在 __schedule() 中使用自旋锁(锁定和解锁)是否安全?让调度程序等待获取锁是否安全?

提前致谢。

【问题讨论】:

  • 我认为通常的机制是锁定和解锁 access 到由多个函数访问/锁定/解锁的自旋锁,这样操作中就不会发生冲突应用于自旋锁

标签: linux kernel scheduler spinlock


【解决方案1】:

您可以使用semaphoremutex,而不是spinlock。您应该在同一个函数中使用spinlock 进行最少的操作集。

【讨论】:

    【解决方案2】:

    不使用来自不同功能的自旋锁/解锁的充分理由并不那么明显。 不这样做的一个重要且非常好的理由是,当您对其进行自旋锁时,它会在调度程序结构中设置一个 ATOMIC 标志 - 从这一刻到您解锁自旋锁的那一刻,您的内核将成为 ATOMIC 上下文。用调试标志编译的内核试试 - 你会在你的 klog 中看到很多 BUG 消息。

    祝你好运。

    【讨论】:

      【解决方案3】:

      如果你的代码设计正确,从多个位置获取和释放同一个自旋锁并没有什么坏处,事实上,这就是它的重点;您可以使用单个自旋锁来实现一组类似于 Linux atomic 操作的功能,但具有您需要的任何额外的内部复杂性。只要在每个函数中获取和释放共享资源的锁,它就可以正常工作。

      主要考虑有:

      1. 使每个声明/发布对之间的代码尽可能简短 - 这是一个原子上下文
      2. 这将在单核系统上正常工作并扩展到抢占式 SMP
      3. 您仍然需要考虑您正在实现的代码类型以及它可能运行的上下文,并为此使用正确类型的自旋锁

      只要您小心对待自旋锁(牢记死锁的可能性)并了解您在自旋锁内所做的任何事情都会影响系统延迟,那么它们就是一个非常有用的工具。

      如果您知道代码中您要求锁定的所有区域始终完成并快速释放,那么您同样可以确定您的代码中的任何其他部分都不会在等待锁定的时间里一直旋转.这可能比使用互斥体更有效。

      使用自旋锁的另一个价值是它充当隐式内存屏障,因此通过对操作某些资源(例如结构的成员)进行锁定,您可以确保通过您的代码的任何其他线程也在读取/写入该资源之前获取锁,查看它的当前状态,而不是由于缓存一致性问题而导致的一些过时值。

      这是一个潜在的复杂主题,但希望这种解释能有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        相关资源
        最近更新 更多