Linux kernel併發處理

理解好併發處理,有幾個小概念是相關的。

1.由於圖靈機本身是依賴side-effect來工作,故同步互斥機制便有了必要性。代碼角度來看,如果依賴了共享的變量,便意味着可能需要同步保護。如果是lamada演算的函數式編程,是不需要同步保護滴。

2.死鎖dead-lock的必要4條件。1. 資源的獨佔性(不可分享) 2. 擁有者佔有後不可剝奪(不可搶佔) 3. 擁有者可佔有多重資源

     4.環路等待

 

序號 類型 分析
1 spinlock自旋鎖

就像在碗裏搶一把鑰匙,搶不到的一直看着碗等。

適合場景

1.簡短快速的保護段。

自旋鎖安全safe

1.擁有者不能在保護段調用任何會休眠的函數。

原因有2:a)休眠時間不會短,會造成其它SMP核無畏的開銷 b)容易引發死鎖,單核下,搶佔關閉,不能調度直接死鎖。多核下會好一點,當前核直接死鎖,如果其它SMP核重入此保護段,會卡住此SMP(因此是先關搶佔),運氣不好耗盡所有的SMP時,系統hang住。

2.如果會在IRQ上下文用spinlock,一定要用IRQ版本。原因是不用IRQ版本,spinlock語義失效。spinlock能關閉搶佔,卻不能避免中斷搶佔執行。

2. 讀寫自旋鎖rwlock

本質上是優化spinlock的性能。

原理上是死鎖條件第一條入手:獨佔性。

多讀其實可以共享,多寫/讀寫是互斥的。

這樣改善了併發讀操作,其它不變。

帶來的side-effect副作用:更容易導致寫者飢餓,原因是讀者能持續接力拿到key.而寫者必然等無讀者時才能拿到key.而不像spinlock大家的對等的機率搶到。

3. 順序鎖seqlock

本質上是優化spinlock的性能。

特點是對寫者友好。

原理上是死鎖條件第一,二條入手:獨佔性,不可搶佔。

多讀共享,讀寫是不再強互斥的。對於寫者間還是獨佔性。

策略:如果在寫,新來的讀者等待寫完。如果是寫者不考慮讀者存在,直接訪問。讀者是通過小技巧(比較保護斷前後計數值變化情況)來確定讀的過程中不存在寫者。

實現依賴:依靠體系int型操作smb內存的原子性

順序鎖safe:

1.讀者保護段併發分析,通常只適合數值型數據。

由於讀寫不保證互斥,也就是在保護段讀的過程中,會被寫者修改,因此讀者此時是不能信任讀到的數據。直到退出保護段才能保證之前在保護段的數據是可信的,由於這個時間差。通常只適合數值型數據,如果是複雜數據操作要仔細分析讀寫衝突下的風險,否則會遇到麻煩。

比如:保護段內訪問指針型數據,存在風險。可能指針正在被寫者改變。

4 RCU鎖  
     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章