spin_lock_irqsave

来源:互联网 发布:深圳龙华行知小学 编辑:程序博客网 时间:2024/04/28 08:15
自旋锁特点:
(1)        自旋锁机制本身不会休眠,所以可以用于不能休眠的代码中(如IRQ 例程)。
(2)        自旋锁有性能优势(加锁/解锁 约7us)

并发是需要同步操作的根源,在SMP上并发的来源如下:
       A 进程间的抢占
       B 异步中断事件
       C 两个以上的CPU,执行同一段代码

如果有一段critical code需要在上面的A、B、C三种情况下都有可能执行到,可使用spin_lock_irq(&lock),因为
(1)        自旋锁本身是禁止本CPU上的抢占,所以A不可能发生
(2)        Spin_lock_irq(&lock)是关本CPU上的中断的,所以B不可能发生
(3)        对于C情况,CPU0没有释放自旋锁时,CPU1一直忙等待,但不会死锁

总结,需思考所要保护的资源的并发执行场景。然后决定是否使用自旋锁,以及使用哪种自旋锁。自旋锁使用不当会有如下问题:
(1)        死锁

(2)        受保护的critical code太多,可能阻止本CPU的任务调度(更高优先级的任务不得不等待),或者其它CPU忙等(不做任何事情)。




==========


spin_lock_irqsave()做了如下工作:
1)关闭本CPU内核抢占;
2)保存本地eflags到外部变量,以便于后续恢复eflags;
3)关闭本地中断;
4)加自旋锁保护;
此时无论从本地CPU上还是其他CPU上都无法进入临界区(本地关闭硬件中断,同时关闭本地CPU内核抢占,其他CPU的进程则在当前CPU上自旋);

spin_unlock_irqrestore()做了如下工作:
1)释放自旋锁;
2)从外部变量恢复本地eflags;
3)开启本地CPU内核抢占;
此时本地CPU上若在spin_lock_irqsave()之前中断是开启的则此时中断恢复开启状态,否则中断仍为关闭状态。本地CPU允许内核抢占。其他CPU可以退出自旋状态进入临界区;

0 0
原创粉丝点击