QSpinlock申请锁的过程,可以分成快速通道,中速通道,和慢速通道总结一下。
快速通道:有点类似我们现在热门的电车,大家去充电桩充电,如果这个充电桩没有人使用,那你就可以用了,这是快速通道。
中速通道:如果我们去充电时候,发现这个充电桩已经有人在使用,但是没有人在排队等待,那么你就是第一个等待的人,相当于拿到了VIP金牌,这个人充满了之后,就轮到你了。
慢速通道:如果有人在充电,而且已经有人在排队了。你一看,妈呀,剩余的路程数不多了,离下一个充电站还有好几百公里,那你只能老老实实排队,这就是里程焦虑,慢速通道。
QSpinLock有啥优点,笨叔觉得有下面几个:
- 集成MCS算法到自旋锁中,继承了MCS算法的所有优点,有效解决了CPU高速缓存行颠簸问题。
- 没有增加spinlock数据结构的大小,把val细分成多个域,完美实现了MCS算法
- 当只有两个CPU试图获取自旋锁时,使用pending域就可以完美解决问题,第2个CPU只需要设置pending域,然后自旋等待锁释放。当有第3个或者更多CPU来争用时,则需要使用额外的MCS节点。第3个CPU会自旋等待锁被释放,即pending域和locked域被清零,而第4个CPU和后面的CPU只能在MCS节点中自旋等待locked域被置1,直到前继节点把locked控制器过继给自己才能有机会自旋等待自旋锁的释放,从而完美解决激烈锁争用带来的高速缓存行颠簸问题。
所以,从经典自旋锁到基于排队的自旋锁,再到现在的排队自旋锁,可以看到社区专家们对性能优化孜孜不倦的追求。也许,在不久将来,qspinlock的实现还会有比较大的变化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。