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

程序员博客

整理的笔记,部分来自网络搜索整理,转载有标明。另外部分为自己创作,可随意复制!

 
 
 

日志

 
 
 
 

自旋锁和信号量  

2009-11-25 12:06:09|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

自旋锁:一种当获取不到锁时,采用循环“测试并设置”的方式等待获取锁的一种互斥锁。

获取方法:采用test-and-set原子操作测试并设置某个内存变量。——实现互斥的方法。

不被打断:通过禁止抢占实现。

使用场合:可在进程上下文和中断上下文使用。

特点:

1、这种锁在获取不到时系统开销大,所以获取锁和释放锁的区间代码执行时间应该尽可能短。

2、在单CPU内核可抢占系统中,自旋锁持有期间内核抢占被禁止。但在单CPU内核不支持抢占的系统,自旋锁退化为空操作。——也就是说,如果持有锁的区间代码执行时间过长,会出现其它操作的不响应(假死机)现象。

3、因为抢占被禁止,自旋锁可保证临界区不受“别的CPU和本CPU内”的抢占进程进程打扰。

4、可能受到中断和底半部(BH)的影响,为此,与开、关中断配合,为此有:

spin_lock_irq(),spin_unlock_irq()

spin_lock_irqsave(),spin_unlock_irqstore()

spin_lock_bh(),spin_unlock_bh()

具体含义请参考教材或网络搜索。

自旋锁的扩展:1、读写自旋锁;2、顺序锁;3、读-拷贝-更新(RCU)

 ***************************************************************************************************

信号量:一种当获取不到锁时,采用睡眠以等待唤醒的方式的一种同步机制。

不被打断:通过何种方式实现没找到参考,但可推断为同自旋锁。

获取方法:同自旋锁。

适用场合:由于会导致睡眠,只能在进程上下文中使用。但是int down_trylock(struct semphore *sem)可以。

 

特点:

获取不到锁时,进入睡眠状态,系统开销为上下文切换的时间Tsw。

 

自旋锁和信号量的对比:

1、当锁不能获取时,信号量开销为Tsw,自旋锁开销为等待获取时间Tcs,这两个时间对比权衡使用哪种机制。

2、信号量可用于保护包含可能引起阻塞的代码(即保护的代码中有可引起睡眠的函数如copy_to_user(),copy_from_user()),自旋锁不能。自旋锁如果也使用这样的代码,当睡眠时另一个程进也要获取这把锁时,会进入循环,而睡眠时间一般相对较长,系统资源开销大的时间过长时,资源耗尽的情况会发生,直到这个睡眠的进程被唤醒,代码执行完毕,资源才得以释放。至于自旋锁区间睡眠引起死锁的情况我实在想不出来。但教材中都这么说。

3、中断上下文中只能使用自旋锁,不可使用信号量。因为中断上下文中是不能被调度的,但睡眠后会发生上下文切换,需要调度,在中断上下文中睡眠只能永久睡眠——死机!

 

 

 

  评论这张
 
阅读(1277)| 评论(0)

历史上的今天

评论

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

页脚

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