自旋锁本质

      自旋锁的实现是靠维护一个16位的整数----slock,该变量是个全局的,所有处理器共享的,汇编代码实现了首先将slock的内容换到每个cpu中维护的一个inc变量中,然后slock+=0x0100,开始的时候,inc的初始值为0x0100,slock的高八位为记录多少进程申请了自旋锁,低八位为标示有多少进程释放了自旋锁。

  进程在申请自旋锁时候,首先将slock的内容拷贝到自己的inc变量中,然后增加了0x0100,这样就每次一个进程申请自旋锁,高八位就加1,而进程这样做了后,就比较自己inc的高八位和低八位是不是一样,如果不一样就将slock的第八位拷贝过来反复检测,如果一样说明,可以申请到自旋锁。

  由于每个进程申请到自旋锁之前都已经将当时slock的高八位保存了,因此这样就维持了一个队列,越早等待的进程,它的inc高位越小;而每个进程释放自旋锁后,slock的地位会增加,它会首先增加到最早申请的进程的inc值,该进程就首先拿到了自旋锁,整个过程可以如下图所示:

 

posted on 2011-12-04 12:59  sprzhing  阅读(424)  评论(0编辑  收藏  举报

导航