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

FY

Johnson 's Blog

 
 
 

日志

 
 

自旋锁是一个基本的概念  

2017-03-09 10:36:33|  分类: Linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
自旋锁是一个基本的概念:
1.Linux中,没有用户态的自旋锁,spin_lock用在内核中。其作用是为了保护临界资源不会被多个线程同时访问。持有自旋锁的代码区域通常被称作临界区。
2.所谓自旋,就是如果一个内核线程A(B,C或者更多)想要获取这个锁S时,但是这个锁已经被其他内核线程T持有,那么A(B,C和其他)线程将一在一个循环中不停的测试锁S的状态,其中等待线程中(A,B,C或者更多)的某一个线程将在T释放自旋锁S之后获取它而退出测试循环。而其他没有获取到的线程将继续对S的测试。自旋因此而得名!
另外,目前的内核中spin_lock好像没有超时的版本,所以他不会在等待一定时间后停止自旋。除非使用spin_trylock,之测试一次!
3.处于自旋锁保护的临界区对于Kernel来说,属于原子操作区域。Kernel不允许在原子操作区内的进程睡眠(睡眠实质上是由于某种原因而主动让出CPU)。否则,既有可能导致死锁!
4.同样,处于自旋锁保护的临界区内kernel不允许被抢占,抢占会在进入临界区时被禁止。
5.在某些情况下,处于自旋锁的临界区也不能不中断,如果你的中断处理中需要持有同样的自旋锁,那么将会导致死锁。这中情况需要程序员小心处理。对付这种问题,可能会需要在关中断的情况下进入临界区。在处理完临界区之后再使能中断!


由于2.6内核版本加入了抢占的特性,但我们可以配置为抢占和非抢占模式。
在单处理器2.6版本的非抢占模式下,spin_lock被编译为一条空语句,什么都不干;
在单处理器2.6版本的抢占模式下,spin_lock可以理解为一个抢占disable的开关,并在spin_unlock中被enable;

在SMP的2.6的抢占模式下,spin_lock才真正发挥了他的全部功能:防止SMP中并发访问临界区,防止内核抢占造成的竞争;并在spin_unlock中退出临界区。
  评论这张
 
阅读(31)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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