注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

自旋锁特点  

2017-02-01 09:28:10|  分类: Linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://bbs.chinaunix.net/thread-4060050-2-1.html
自旋锁特点:
(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可以退出自旋状态进入临界区;
  评论这张
 
阅读(9)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017