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

时间:2010-08-12 04:06:42

标签: c operating-system linux-kernel

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

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

  • 我们可以在中断处理程序中使用semaphoremutex吗?答案是肯定的,不是。你可以使用向上和解锁,但你不能使用向下和锁定,因为这些是阻止调用,将进程置于sleep我们是不应该在中断处理程序中睡觉。
  • 注意,信号量不是systemV IPC技术,它只是一种同步技术。并且有三个函数可以获取信号量。

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

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

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

自旋锁会做什么

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

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

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

  

在自旋锁的情况下,它进入紧密循环,在那里   持续检查锁定,直到锁定为止

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