前几天小明同学和笨叔抱怨:现在的spinlock锁的代码变得越来越复杂了,我都看不懂了。的确spinlock的代码从原来简单的几行代码,变成现在复杂的几百行,除了代码变得复杂,里面隐含的原理也不简单。

在linux内核的spinlock的实现历史中,一共有三个版本的spinlock实现。

第一个是经典的spinlock实现。

第二个是Ticket spinlock的实现。

第三个是基于MCS算法的queued spinlock的实现。

第一个最简单,在ARM64上实现就是几行汇编代码就搞定了。

20220318_160008_039.jpg

第二种实现也不难,几十行汇编也搞定了。

20220318_160008_040.jpg

第三种实现,反而从汇编代码变成了C代码,代码量也变多了。

20220318_160008_041.jpg

前面两种锁机制,究竟遇到了些啥问题。经典spinlock会导致不公平的问题,经典的spinlock就是一群CPU去抢一个锁,那有可能出现,最早来抢的人 反而没有抢到,而刚刚释放锁的CPU,后面加入抢的,反而容易抢到。大家有没有发现一个现象:比如在上海坐地铁,你一直站在一个座位旁边等座位,本来就你一个人在这个座位旁边虎视眈眈。过了几个站之后,你发现这个座位旁边又多了几个人虎视眈眈,当这个坐着的人要下车了,然后呢,你没有抢到座位,你是不是很气愤,麻蛋,我都站了好几站了,居然被新上车的年轻小伙抢到位置,你说气不气!

所以,经典spinlock就是这个问题。后来,我们就出现了ticket spinlock,类似我们到外面吃饭,叫号,相对公平,先来先到,解决了公平问题。当然啦,地铁里,抢位置,没有这种福利。

要理解MCS锁,可能先要理解经典spinlock锁带来的cache颠簸问题,有兴趣的同学可以看看水货笨叔的视频讲解。


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

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


引用和评论

0 条评论