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) 死锁
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可以退出自旋状态进入临界区;
(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忙等(不做任何事情)。
==========
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
- spin_lock_irqsave
- spin_lock & spin_lock_irqsave
- 从spin_lock到spin_lock_irqsave
- 从spin_lock到spin_lock_irqsave
- 从spin_lock到spin_lock_irqsave
- spin_lock_irqsave与spin_lock_irq
- spin_lock_irq和spin_lock_irqsave
- spin_lock_irqsave和spin_lock
- 从spin_lock到spin_lock_irqsave
- 从spin_lock到spin_lock_irqsave
- 从spin_lock到spin_lock_irqsave
- 从spin_lock到spin_lock_irqsave
- spin_lock、spin_lock_irq、spin_lock_irqsave区别
- spin_lock_irqsave()中的flags初始化
- spin_lock、spin_lock_irq、spin_lock_irqsave区别
- spin_lock_irq和spin_lock_irqsave区别
- spin_lock和spin_lock_irqsave
- spin_lock、spin_lock_irq、spin_lock_irqsave区别
- Dynamics CRM 在报表中获取当前登陆用户的guid
- RadioGroup的坑[api10以下]
- hdu 5167 Fibonacci(dfs)
- Effective C++笔记
- cocos2d-x 学习之路 --第一步环境搭建
- spin_lock_irqsave
- 让数组内的元素依次调用同一个方法
- iOS 下载图片前如何预取图片的大小
- iOS开发UI篇—Quartz2D使用(信纸条纹)
- 字典树小结
- chromium issues
- java环境配置为1.7jdk为什么cmd java -version查看版本是1.8||win7 java(tm) platform se binary 已停止工作 出现了一个问题,导致程序停止正常
- [Swift内存管理-示例讲解]
- ZOJ Problem Set - 1006 Do the Untwist