为什么在中断处理程序中使用自旋锁

我想知道为什么在中断处理程序中使用自旋锁而不是信号量。

信号量导致任务在争用时hibernate,这对于中断处理程序是不可接受的。 基本上,对于这种短而快的任务(中断处理),信号量执行的工作是过度的。 此外,自旋锁不能由多个任务保持。

问题是中断处理程序(IH)以不可预测的方式异步触发,超出了系统中运行的任何其他活动的范围。 事实上,IH完全没有线程和调度的概念范围。 由于这一点,依赖于调度程序的所有互斥原语都是不可接受的。 因为它们在IH中的使用可以显着增加中断处理延迟(在IH在低优先级线程的上下文中运行的情况下)并且能够产生死锁(在IH在保持锁的线程的上下文中运行的情况下)。

您可以在http://www.makelinux.net/ldd3/chp-5-sect-5上查看有关自旋锁的详细描述。

什么是信号量和互斥量的问题。 为什么需要螺旋锁?

  • 我们可以在中断处理程序中使用semaphoremutex semaphore 。 答案是肯定的,不是。 你可以使用up和unlock ,但你不能使用down和lock ,因为这些是阻塞调用,使进程进入sleep ,我们不应该在中断处理程序中hibernate。
  • 注意,信号量不是systemV IPC技术,它只是一种同步技术。 并且有三个函数来获取信号量。

    • down() :获取信号量并进入不可中断状态。

    • down_trylock() :尝试锁定是否可用,如果锁定不可用,请不要睡觉。

    • up() : – 它对释放信号量很有用
  • 那么,如果我们想在中断处理程序中实现同步呢? 使用自旋锁

什么螺旋锁会做什么?

  • Spinlock是一个永不屈服的锁。

  • 与互斥锁类似,它有两个操作 – 锁定和解锁。

  • 如果锁定可用,则进程将获取它并将在关键部分继续并在完成后将其解锁。 这类似于mutex 。 但是, 如果锁不可用怎么办? 在这里,有趣的区别。 使用mutex ,进程将sleep ,直到锁定可用。 但,

在自旋锁的情况下,它进入紧密循环,在那里它不断检查锁,直到它变得可用

  • 这是旋转锁的旋转部分。 这是为多处理器系统设计的。 但是,对于可抢占的内核,即使是单处理器系统也像SMP一样。