Linux内核 - 我可以在不同的函数中锁定和解锁Spinlock吗?

时间:2013-11-04 04:41:56

标签: linux kernel scheduler spinlock

我不熟悉内核编程和使用锁编程。

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

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

提前致谢。

3 个答案:

答案 0 :(得分:0)

您可以使用spinlocksemaphore代替mutex。您应该在同一个函数中使用spinlock进行最小的操作。

答案 1 :(得分:0)

不使用不同功能的自旋锁/解锁的一个很好的理由并不那么明显。 一个大而且非常好的理由不这样做是因为当你在它上面设置自旋锁时,在调度程序结构中设置了一个标志ATOMIC - 你的内核从此刻开始变为ATOMIC上下文,直到解锁自旋锁。尝试使用调试标志编译的内核 - 你会在你的klog中看到很多BUG消息。

祝你好运。

答案 2 :(得分:0)

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

主要考虑因素是:

  1. 保持每个声明/发布对之间的代码尽可能简短 - 它是一个原子上下文
  2. 这将在单个核心系统上正常工作并扩展到先发制人的SMP
  3. 你仍然需要考虑你正在实现什么类型的代码以及它可能运行的上下文,并使用正确类型的spinlock
  4. 只要你小心对待螺旋锁 - 记住死锁的可能性 - 并了解你在螺旋锁内做的任何事情都会影响系统延迟,那么它们是一个非常有用的工具。

    如果您知道代码中您声称锁定的所有区域始终完成并快速释放,那么您可以同样确保您的代码中的任何其他位置都无法旋转多年在等待锁。使用互斥锁可能会更有效。

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

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