网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

有关Windows自旋锁的一点儿记录

    自旋锁

    本文出自悠然品鉴 小悠,转载请注明出处:http://www.youranshare.com/blog/sid/72.html

    

    反复看了一天的windows内核驱动的同步问题,现在赶脚整个人都不对了,一下子得消化这么多东东真是有点儿困难,不过还好了解了点儿东西,在内核同步的问题上个人觉得自旋锁这种东西还是比较有看头的,这里就记录一下自旋锁的一些问题。

 

自旋锁 英文单词是Spin Lock,它本身也是一种同步机制,能够保证某个资源只能被一个线程所拥有,这种机制也被形象的称之为“上锁”

 

说一下自旋锁的基本原理吧

在windows内核中,有一种被称为自旋锁的锁= =,它可以用于驱动程序的同步处理。在初始化自旋锁的时候,锁处于解锁的状态,这时可以被程序“获取”,被“获取”后自旋锁处于锁定状态,不能被再次“获取”,只有等到锁被释放后才能被再次获取到。

 

如果自旋锁被锁住,这时有程序想获取到这个锁的话,程序就会处于“自旋”状态,这里所说的自旋就是说程序一直处于循环查询锁的状态中,这也是自旋的得名。

 

不同于其他的同步方式,比如线程在等待一个事件(Event)的时候,操作系统会让这个线程休眠,而自旋锁不会睡眠,他会不停的循环查询锁的状态(自旋),直到可以获取到锁为止,也就是说自旋锁会比较占用CPU时间,因此对自旋锁的占用时间不应该太长,要不就太浪费资源了。

 

在单核CPU中自旋锁的实现

对于线程来说有一个线程优先级,高优先级的线程可以打断低优先级的线程优先执行;

   Windows中还有一个叫做 中断请求级(IRQL)的东西,现在一共有32个中断请求级别,线程所在的IRQL是PASSIVE_LEVEL是最低的0级,也就是说任何一个高于线程的IRQL的中断都会打断线程的执行,Windows中负责线程调度的组件是位于DISPATH_LEVEL第2级,所以才能调度线程嘛、、试想一下如果将某一个线程的中断级别提升到DISPATH_LEVL,那么就连线程调度组件也不能打断线程的执行了,我们知道在单核的CPU中实际上是串行执行的,所以单核的CPU的自旋锁就比较简单了,在第一次获取锁的时候直接将线程中断等级提升至DISPATH_LEVEL,那么CPU就只能执行这个线程了,其他的线程只能是等待,这样就能实现单核CPU下自旋锁了,因为其他的线程根本没机会执行嘛,等执行完成了之后在将中断等级恢复原来的PASSIVE_LEVEL 0级其他线程就能有机会执行了。

 

多核CPU中自旋锁的实现

多核的CPU中,单纯的提升中断等级是不够的,一个CPU被占用不能切换线程,但是还有其他的CPU可以执行的,这里我就简单的描述一下多核CPU的自旋锁:


自旋锁实际上是一个与操作系统有关的整数,0表示锁空闲,非零表示所被占用,获取锁的时候看一下这个数值,0就直接获取到,然后修改为非零,如果是非零,那就while循环等待吧,知道可以获取到锁为止。


更深层次的了解自旋锁的分析,你可以到这里http://bbs.pediy.com/showthread.php?t=74502


看雪的一个大牛发的见解,小悠这里就不在详细的介绍了。

 


  • 标签:
  • 内核自旋锁
  • 单核CPU自旋锁
  • 多核CPU自旋锁
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.