20220321_135545_005.jpg
QSpinlock申请锁的过程,可以分成快速通道,中速通道,和慢速通道总结一下。

快速通道:有点类似我们现在热门的电车,大家去充电桩充电,如果这个充电桩没有人使用,那你就可以用了,这是快速通道。

20220321_135545_006.jpg

中速通道:如果我们去充电时候,发现这个充电桩已经有人在使用,但是没有人在排队等待,那么你就是第一个等待的人,相当于拿到了VIP金牌,这个人充满了之后,就轮到你了。

20220321_135545_007.jpg

慢速通道:如果有人在充电,而且已经有人在排队了。你一看,妈呀,剩余的路程数不多了,离下一个充电站还有好几百公里,那你只能老老实实排队,这就是里程焦虑,慢速通道。

20220321_135545_008.jpg

20220321_135545_009.jpg

QSpinLock有啥优点,笨叔觉得有下面几个:

  1. 集成MCS算法到自旋锁中,继承了MCS算法的所有优点,有效解决了CPU高速缓存行颠簸问题。
  2. 没有增加spinlock数据结构的大小,把val细分成多个域,完美实现了MCS算法
  3. 当只有两个CPU试图获取自旋锁时,使用pending域就可以完美解决问题,第2个CPU只需要设置pending域,然后自旋等待锁释放。当有第3个或者更多CPU来争用时,则需要使用额外的MCS节点。第3个CPU会自旋等待锁被释放,即pending域和locked域被清零,而第4个CPU和后面的CPU只能在MCS节点中自旋等待locked域被置1,直到前继节点把locked控制器过继给自己才能有机会自旋等待自旋锁的释放,从而完美解决激烈锁争用带来的高速缓存行颠簸问题。

20220321_135545_010.jpg
20220321_135545_011.jpg
20220321_135545_012.jpg
20220321_135545_013.jpg
640.png
20220321_135545_015.jpg
20220321_135545_016.jpg

所以,从经典自旋锁到基于排队的自旋锁,再到现在的排队自旋锁,可以看到社区专家们对性能优化孜孜不倦的追求。也许,在不久将来,qspinlock的实现还会有比较大的变化。


奔跑吧Linux社区
4 声望4 粉丝

奔跑吧Linux社区,为广大小伙伴布道Linux开源!


引用和评论

0 条评论