为什么在中断处理程序中使用自旋锁
我想知道为什么在中断处理程序中使用自旋锁而不是信号量。
信号量导致任务在争用时hibernate,这对于中断处理程序是不可接受的。 基本上,对于这种短而快的任务(中断处理),信号量执行的工作是过度的。 此外,自旋锁不能由多个任务保持。
问题是中断处理程序(IH)以不可预测的方式异步触发,超出了系统中运行的任何其他活动的范围。 事实上,IH完全没有线程和调度的概念范围。 由于这一点,依赖于调度程序的所有互斥原语都是不可接受的。 因为它们在IH中的使用可以显着增加中断处理延迟(在IH在低优先级线程的上下文中运行的情况下)并且能够产生死锁(在IH在保持锁的线程的上下文中运行的情况下)。
您可以在http://www.makelinux.net/ldd3/chp-5-sect-5上查看有关自旋锁的详细描述。
什么是信号量和互斥量的问题。 为什么需要螺旋锁?
- 我们可以在中断处理程序中使用
semaphore
或mutex
semaphore
。 答案是肯定的,不是。 你可以使用up和unlock ,但你不能使用down和lock ,因为这些是阻塞调用,使进程进入sleep
,我们不应该在中断处理程序中hibernate。 -
注意,信号量不是systemV IPC技术,它只是一种同步技术。 并且有三个函数来获取信号量。
-
down() :获取信号量并进入不可中断状态。
-
down_trylock() :尝试锁定是否可用,如果锁定不可用,请不要睡觉。
- up() : – 它对释放信号量很有用
-
-
那么,如果我们想在中断处理程序中实现同步呢? 使用自旋锁 。
什么螺旋锁会做什么?
-
Spinlock是一个永不屈服的锁。
-
与互斥锁类似,它有两个操作 – 锁定和解锁。
-
如果锁定可用,则进程将获取它并将在关键部分继续并在完成后将其解锁。 这类似于
mutex
。 但是, 如果锁不可用怎么办? 在这里,有趣的区别。 使用mutex
,进程将sleep
,直到锁定可用。 但,
在自旋锁的情况下,它进入紧密循环,在那里它不断检查锁,直到它变得可用
。
- 这是旋转锁的旋转部分。 这是为多处理器系统设计的。 但是,对于可抢占的内核,即使是单处理器系统也像SMP一样。