1. 程式人生 > >小區外的蒸米粉和Linux RCU鎖

小區外的蒸米粉和Linux RCU鎖

log art 理解 task line 手機 mark sso 流程化

一直希望能用一種及其通俗的方式把Linux RCU鎖(所謂兩階段可搶占RCU鎖)描述出來。之前寫過一篇:
《Linux內核RCU(Read Copy Update)鎖簡析》:https://blog.csdn.net/dog250/article/details/46848649
雖然把代碼邏輯簡化了,但是寫得並不好,這個太針對於實現了…而如果真正理解了這個並且希望表達,那RCU的精髓應該是路邊賣烤地瓜的都應該明白的。最近正好聊到了RCU,就又想起了這個話題。

??這裏烤地瓜的不多,但有很多賣蒸米粉的,小區外面就有好幾家,今早剛剛還吃了一份。我是最不愛玩手機的,等待出爐的間隙,我仔細觀察了做蒸米粉的這個抽屜式爐子


技術分享圖片
本應該拍個照的,然而可能是骨子裏抵觸手機吧,全程沒有把手機從褲兜裏拿出來…

??師傅不停地拉開各個抽屜,看細節,然後就知道是不是該打進去一個雞蛋,澆點湯汁…總之,每一層的抽屜容器裏包含兩部分內容:

  • 原材料
  • 加工工序

原材料是放進去的物品,比如粉條,蔬菜,雞蛋等,而加工工序則是原材料到達什麽程度要做什麽事的一些列步驟,同時還有原材料沒有達到什麽程度不能做什麽的規定,這一點更加重要!也許你會覺得我說的都是廢話,家裏做飯不都是這樣嗎?然而有個不同。

??家裏做飯包括飯店後廚做飯是可以試錯的,不同的人做飯是否好吃取決於該人在廚藝上的造詣,而這個蒸米粉卻和KFC差不多,全部都是流程化操作,所以說,這簡直是一個Howto!


嗯,Linux在RCU處理上的機制和蒸米粉非常類似!

??Linux RCU(以後簡稱RCU)將所謂的寬限期靜默期等各種抽象成了容器,每一個調用rcu lock/unlock的task均在這些容器裏進行,每一個容器攜帶一個callback list,只有當容器內的lock全部被unlock之後,才能被調用。這個理解起來非常簡單。

??好了,現在被RCU容器分為了三類,這也是典型的分類,幾乎存在於任何領域:

  • 空閑容器
  • 已經滿載打好包的容器
  • 正在填充的容器

隨著時間的流逝,這三類容器的角色在不斷轉變,這是一個在時間,空間兩個維度不斷延展的。在RCU容器中,如果該容器內所有的lock區域全部unlock了,那麽該容器就算打好包了,這個時候就可以執行其callback list了,其實就是一個TODO list…

??現在,我把RCU的這三類容器按照時間和空間兩個維度展開:
技術分享圖片

其中實線圓圈表示lock,虛線圓圈表示已經unlock。

??空閑的容器是可以被重用的,所以說根本就沒有必然保留它們,即刻重用就好了。所以說,RCU容器只有兩類即可:
技術分享圖片


其實,區塊鏈的區塊也是一種滿足某種特定條件的容器,只是區塊是永久容器,而RCU則是瞬時容器之間的區別。


本文並沒有說透RCU的全部,比如強序型內存屏障的發布-訂閱模式。也沒有說Tree RCU的思想,更是沒有提RCU最近的進化,所以本文依然只是一篇技術隨筆,而不是工作文檔。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

小區外的蒸米粉和Linux RCU鎖