Linux内核 – 我可以locking和解锁Spinlock在不同的function?

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

locking和解锁不同function的自旋锁是否安全? 我正在做这个来同步代码stream。

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

提前致谢。

而不是spinlock ,你可以使用semaphoremutex semaphore 。 对于最小的一组操作,您应该在同一个函数中使用spinlock

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

祝你好运。

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

主要考虑因素是:

  1. 保持每个索赔/释放对之间的代码尽可能简短 – 这是一个原子上下文
  2. 这将在一个单一的核心系统上正常工作,并扩展到先发制人的SMP
  3. 你仍然需要考虑你正在执行什么类型的代码以及它可能在哪个上下文上运行,并使用正确类型的自旋锁

只要你谨慎对待自旋锁 – 牢记潜在的僵局 – 并且理解你在自旋锁内做的任何事情都会影响系统的延迟,那么它们是一个非常有用的工具。

如果您知道代码中所有声明锁的区域总是可以完成并快速释放,那么您同样可以确信,代码中的其他任何位都不会在锁上等待很长时间。 使用互斥锁可能会更有效率。

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

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