这段代码仍然处于 lock1 的临界区,如果此时硬件中断也需要申请 lock1 锁会导致死锁,这是因为 spin_unlock_irq 在解锁时一定会将本地 CPU 的中断打开,从而导致硬件中断可以重新强制抢占 CPU,所以最好的方式就是 lock2 在锁之前保存当前的中断状态,在解锁时恢复当前的中断状态,这也就是 spin_lock_irqsave 需要...
(1) 临界区只出现在进程上下文:spin_lock (2) 硬件中断中:spin_lock 3.2 spin_lock_irq 上下文/软中断 + 硬件中断 3.3 spin_lock_irqsave 这种类型的使用方式是最为安全以及便捷的; 3.4 spin_lock_bh 只关闭中断底半部,其实就是关闭了软中断、Taskset 以及 Timer 等的一个抢占能力 代码临界区只存在软中断...
不过,对于这种类型的中断最好的方式是使用 spin_lock_bh 的方式,因为他只锁定软中断代码执行,而不关闭硬件中断,这样性能损耗更小。 spin_lock_irqsave 使用场景 这种类型的使用方式是最为安全以及便捷的,毕竟不需要考虑会不会发生死锁的问题(代码本身引入的死锁不在此类), 但是他也是性能损耗最大的代码,能不使用...
spinJockJrqO:关闭CPU屮断,屮断和进程都不可以打断。主要用于进程上下文,防 .11:进程被1卩断和其它进程访问临界资源。 spin_lock_irqsave():保存中断标志,关闭CPU中断,中断和进程都不可以打断,解锁 时恢复中断标志。主要用于进程上下文,防止进程被中断和其它进程访问临界资源。反馈...
spin_lock_irq--->raw_spin_lock_irq spin_lock_irq 和 spin_unlock_irq, 如果你确定在获取锁之前本地中断是开启的,那么就不需要保存中断状态,解锁的时候直接将本地中断启用就可以啦 3. spin_lock_irqsave/spin_unlock_irqrestore 使用spin_lock_irqsave在于你不期望在离开临界区后,改变中断的开启/关闭状态!
在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢占。 spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。 spin_lock_irqsave spin_lock_irqsave--->__raw_spin_lock_irqsave 1staticinlineunsignedlong__raw_spin_lock_irqsave(raw_spinlock_t*lock) ...
1、spin_lock与spin_lock_irq区别 在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。 spin_lock的调用关系 spin_lock | + ---> raw_spin_lock | +---> _raw_spin_lock | +---> __raw_spin_lock 1. 2. 3. 4...
spin_lock_irqsave在进入临界区前,保存当前中断寄存器flag状态,关中断,进入临界区,在退出临界区时,把保存的中断状态写回到中断寄存器。 spin_lock_irq在进入临界区前不保存中断状态,关中断,进入临界区,在退出临界区时,开中断。 spin_lock_irqsave锁返回时,中断状态不会被改变,调用spin_lock_irqsave前是开中断返回...
linux-kernel之spin_lock_irqsave和spin_lock_irq 在SMP机器上,我们必须使用spin_lock_irqsave而不是来自中断上下文的spin_lock_irq。 为什么我们要保存标志(包含IF)? 是否有另一个中断例程可以中断我们? 请您参考如下方法: 我是内核的新手,但是从我从罗伯特·洛夫(Robert Love)的书“Linux Kernel Development”(...
5. 自旋锁的临界区本地cpu不会发生任何进程调度:http://blog./uid-23769728-id-3367773.html 总结: 1. 这样是否可以这么说,spin_lock为了防止内核的抢占死锁,spin_lock_irq为了防止内核和中断的抢占死锁,spin_lock_irqsave为了防止进入自旋状态丢掉之前的中断状态。 2....