一直希望能用一種及其通俗的方式把linux rcu鎖(所謂兩階段可搶占rcu鎖)描述出來。之前寫過一篇:
《linux核心rcu(read copy update)鎖簡析》
:雖然把**邏輯簡化了,但是寫得並不好,這個太針對於實現了…而如果真正理解了這個並且希望表達,那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最近的進化,所以本文依然只是一篇技術隨筆,而不是工作文件。
union和union all的小區別
最近接的sql小任務,快被搞崩潰了.也看出了自身的很多問題.對sql的淺顯理解.等等吧.1.首先用union或者是union all首先要保證 select出的字段相同,順序相同,類別相同 2.union all是直接連線,取到得是所有值,記錄可能有重複 union 是取唯一值,記錄沒有重複.3.對...
以炒公尺粉為例,講解瀑布和敏捷的區別
很多專案推行敏捷開發很長一段時間,仍然弄不清楚瀑布和敏捷到底有什麼區別,這裡以炒公尺粉為例,講解兩者的區別。瀑布 就是自己在家裡炒公尺粉 家裡炒公尺粉,一般是按照以下流程 先準備好足量的公尺粉 胡蘿蔔 蔥 白菜 然後切胡蘿蔔絲 白菜絲 蔥,同時用開水泡公尺粉 接著下油鍋,胡蘿蔔絲 白菜絲等一起翻炒,...
MTK基於基站和小區的定位技術研究
我們的流動網路是通過乙個個基站連線起來的,而乙個基站又被劃分成若干小區以方便查詢。因為基站的位置相對比較固定,所以我們可以通過基站的編號cell id和小區的編號lac來定位地理位置。具體的理論原理大概是這樣的。根據gsm協議通訊管理過程,我們大致可以知道呼叫建立的過程首先是使用者定位,查詢被呼叫人...