5,内核同步
- 內核搶占?
- 無論在搶占還是非搶占內核中,運行在內核態的進程都可以自動放棄CPU.稱為計劃性進程切換.但是,搶占式內核在相應引起進程切換的異步事件的方式上有差異,稱為強制性進程切換.
- 搶占式內核的特點: 一個在內核態運行的進程,可能在執行內核函數期間被另一個進程取代.可搶占式的目的是減少用戶態進程的分派延遲(即從進程變為可執行狀態到它實際開始運行之間的間隔).但是它會引起不容忽視的開銷.
- 只有當內核正在執行異常處理程序,且內核搶占沒有被顯示禁止時,才可能搶占內核.同時本地CPU必須打開本地中斷.
- 需要同步的情況: 當計算的結果依賴于兩個或以上的交叉內核控制路徑的嵌套方式時,可能出現競爭條件.臨界區是一段代碼,在其他的內核控制路徑能夠進入臨界區前,進入臨界區的內核控制路徑必須全部執行完這段代碼. 必須確保在任意時刻只有一個內核控制路徑處于臨界區.
- 不需要同步的:1)中斷處理程序和tasklet不必編寫成可重入函數; 2)僅被軟中斷和tasklet訪問的每CPU變量不需要同步; 3)僅被一種tasklet訪問的數據結構不需要同步.
- 每CPU變量:最好的同步技術是吧設計不需要同步的內核放在首位.因為顯式的同步原語都有性能開銷. 吧內核變量聲明為每CPU 變量.?
- 僅當確定在系統的CPU上的數據在邏輯上是獨立的時候才使用.
- 主要是數據結構的數組,每個CPU對應數組的一個元素.在主存中被排列以使每個數據結構存放在Cache的不同行.所以,并發訪問不會引起Cache行的切用和失效
- 對來自不同CPU的并發訪問提供保護,但是對來自異步函數的訪問不提供保護.
- 原則:內核控制路徑應該在禁用搶占的情況下訪問每CPU變量.
- 原子操作:?
- 若干匯編指令具有"讀-修改-寫"類型.即訪問存儲器單元兩次,一次讀,一次寫.
- 確保這樣的操作在芯片級是原子的.任何這樣的操作都必須以單個指令執行.
- 優化和內存屏障?
- 使用優化的編譯器時,指令不會嚴格按照他們在源代碼中出現的順序執行.此外,CPU通常并行地執行若干條指令,且可能重新安排內存訪問.
- 但是在處理同步時,必須避免指令重新排序.所以,所有的同步原語起優化和內存屏障的作用.
- 優化屏障:保證編譯程序不會混淆放在原語操作之前和之后的匯編指令.但并不保證不使當前CPU把匯編指令混在一起執行.
- 內存屏障:在原語執行之前,原語之前的操作已經完成,類似于防火墻.
- 自旋鎖?
- 加鎖技術:當內核控制路徑必須訪問共享數據結構或進入臨界區時,就需要為自己獲取一把"鎖".
- 自旋鎖用在多CPU下.如果鎖開著,就獲取鎖并繼續自己的執行.相反,當鎖由運行在另一CPU上的內核控制"鎖著"時,就在周圍"旋轉"反復執行一條緊湊的循環指令(忙等).直到鎖被釋放.
- 在自旋鎖忙等時,內核搶占還是有效的.等待自旋鎖釋放的進程有可能被更高優先級的進程替代.
- 讀寫自旋鎖?
- 為了增加內核的并發能力.在沒有寫的情況下,允許并發的讀操作.
轉載于:https://www.cnblogs.com/robyn/p/3729343.html
總結
- 上一篇: GIS数据格式:Geodatabase
- 下一篇: [家里蹲大学数学杂志]第034期中山大学