3

I'm new to Kernel programming and programming with locks.

Is it safe to lock and unlock a spinlock in different functions? I am doing this to synchronize the code flow.

Also, is it safe to use spinlock (lock & unlock) in __schedule()? Is it safe to keep the scheduler waiting to acquire a lock?

Thanks in advance.

4

3 回答 3

0

代替spinlock,您可以使用 asemaphore或 a mutex。您应该spinlock在相同的函数中使用最少的操作集。

于 2013-11-05T10:09:40.803 回答
0

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

祝你好运。

于 2013-12-22T11:12:50.710 回答
0

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

主要考虑因素是:

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

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

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

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

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

于 2014-03-15T13:09:25.443 回答