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