前几天小明同学和笨叔抱怨:现在的spinlock锁的代码变得越来越复杂了,我都看不懂了。的确spinlock的代码从原来简单的几行代码,变成现在复杂的几百行,除了代码变得复杂,里面隐含的原理也不简单。
在linux内核的spinlock的实现历史中,一共有三个版本的spinlock实现。
第一个是经典的spinlock实现。
第二个是Ticket spinlock的实现。
第三个是基于MCS算法的queued spinlock的实现。
第一个最简单,在ARM64上实现就是几行汇编代码就搞定了。
第二种实现也不难,几十行汇编也搞定了。
第三种实现,反而从汇编代码变成了C代码,代码量也变多了。
前面两种锁机制,究竟遇到了些啥问题。经典spinlock会导致不公平的问题,经典的spinlock就是一群CPU去抢一个锁,那有可能出现,最早来抢的人 反而没有抢到,而刚刚释放锁的CPU