水貨笨叔介紹MCS鎖

rlk8888發表於2022-03-18

前幾天小明同學和笨叔抱怨:現在的spinlock鎖的程式碼變得越來越複雜了,我都看不懂了。的確spinlock的程式碼從原來簡單的幾行程式碼,變成現在複雜的幾百行,除了程式碼變得複雜,裡面隱含的原理也不簡單。


在linux核心的spinlock的實現歷史中,一共有三個版本的spinlock實現。

第一個是經典的spinlock實現。

第二個是Ticket spinlock的實現。

第三個是基於MCS演算法的queued spinlock的實現。


第一個最簡單,在ARM64上實現就是幾行彙編程式碼就搞定了。


第二種實現也不難,幾十行彙編也搞定了。


第三種實現,反而從彙編程式碼變成了C程式碼,程式碼量也變多了。

前面兩種鎖機制,究竟遇到了些啥問題。經典spinlock會導致不公平的問題,經典的spinlock就是一群CPU去搶一個鎖,那有可能出現,最早來搶的人 反而沒有搶到,而剛剛釋放鎖的CPU,後面加入搶的,反而容易搶到。大家有沒有發現一個現象: 比如在上海坐地鐵,你一直站在一個座位旁邊等座位,本來就你一個人在這個座位旁邊虎視眈眈。過了幾個站之後,你發現這個座位旁邊又多了幾個人虎視眈眈,當這個坐著的人要下車了,然後呢,你沒有搶到座位,你是不是很氣憤,麻蛋,我都站了好幾站了,居然被新上車的年輕小夥搶到位置,你說氣不氣!


所以,經典spinlock就是這個問題。後來,我們就出現了ticket spinlock,類似我們到外面吃飯,叫號,相對公平,先來先到,解決了公平問題。當然啦,地鐵裡,搶位置,沒有這種福利。


要理解MCS鎖,可能先要理解經典spinlock鎖帶來的cache顛簸問題,有興趣的同學可以看看水貨笨叔的視訊講解。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005277/viewspace-2872539/,如需轉載,請註明出處,否則將追究法律責任。

相關文章