Linux kernel併發處理

2021-09-28 17:03:20 字數 1420 閱讀 4114

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

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.讀者保護段併發分析,通常只適合數值型資料。

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

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

4rcu鎖

Linux Kernel啟動中引數的處理

1.在bootloader中會以taglist的形式儲存板子mem cmdline cmdline中也可以定義mem資訊 等相關資訊,cmdline通過getenv從環境變數取得 該環境變數是之前使用setenv以字串形式配置 addr和size。跳轉到kernel前,r0 0,r1 proc ty...

linux kernel中的中斷處理流程

2 linux kernel arm64的中斷函式處理流程 1 linux kernel arm32的中斷函式處理流程 我們從irq handler巨集函式看起 1 irq handler巨集 注意config multi irq handler巨集表示 允許每台機器在執行時指定它自己的irq處理程...

Hibernate 處理併發

一 事務 指運算元據庫的乙個程式執行單無,這些操作要麼全部成功,要麼全部失敗以保證資料的完成性和統一性.二 多事務併發引起的問題 a 第一類丟失更新 撤銷乙個事務時把其它事務更新的資料也覆蓋了。for example 事務a 和b 同時訪問數 據data 如果事務b 更新了資料,但事務a執行了回滾操...