理解好併發處理,有幾個小概念是相關的。
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鎖 | |