前几天小明同学和笨叔抱怨:现在的spinlock锁的代码变得越来越复杂了,我都看不懂了。的确spinlock的代码从原来简单的几行代码,变成现在复杂的几百行,除了代码变得复杂,里面隐含的原理也不简单。
在linux内核的spinlock的实现历史中,一共有三个版本的spinlock实现。
第一个是经典的spinlock实现。
第二个是Ticket spinlock的实现。
第三个是基于MCS算法的queued spinlock的实现。
第一个最简单,在ARM64上实现就是几行汇编代码就搞定了。
第二种实现也不难,几十行汇编也搞定了。
第三种实现,反而从汇编代码变成了C代码,代码量也变多了。
前面两种锁机制,究竟遇到了些啥问题。经典spinlock会导致不公平的问题,经典的spinlock就是一群CPU去抢一个锁,那有可能出现,最早来抢的人 反而没有抢到,而刚刚释放锁的CPU,后面加入抢的,反而容易抢到。大家有没有发现一个现象:比如在上海坐地铁,你一直站在一个座位旁边等座位,本来就你一个人在这个座位旁边虎视眈眈。过了几个站之后,你发现这个座位旁边又多了几个人虎视眈眈,当这个坐着的人要下车了,然后呢,你没有抢到座位,你是不是很气愤,麻蛋,我都站了好几站了,居然被新上车的年轻小伙抢到位置,你说气不气!
所以,经典spinlock就是这个问题。后来,我们就出现了ticket spinlock,类似我们到外面吃饭,叫号,相对公平,先来先到,解决了公平问题。当然啦,地铁里,抢位置,没有这种福利。
要理解MCS锁,可能先要理解经典spinlock锁带来的cache颠簸问题,有兴趣的同学可以看看水货笨叔的视频讲解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。