1. 程式人生 > >同步和臨界區(資源競爭問題)

同步和臨界區(資源競爭問題)

     實現可重入核心需要利用同步機制:如果核心控制路徑對某個核心資料結構進行操作時被掛起,那麼,其他的核心控制路徑就不應該再對該資料結構進行操作,除非它已被重新設定成一致性(consistent)狀態。否則,兩個控制路徑的互動作用將破壞所儲存的資訊。

       例如,假設全域性變數V包含某個系統資源的可用項數。第一個核心控制路徑A讀這個變數,並且確定僅有一個可用資源項。這時,另一個核心控制路徑B被啟用,並讀同意變數V,V值仍為1。因此,B對V減1,並開始用這個資源項,然後,A恢復執行,因為A已經讀取到V的值,於是它假定自己可以對V減1並獲取B已經在使用的這個資源項,結果,V的值變為-1,兩個核心控制路徑使用相同的資源項有可能導致災難性的後果。

        在某個計算結果取決於如何排程兩個或多個程序時,相關程式碼就是不正確的。我們說存在一種競爭條件(race  condition)。一般來說,對全域性變數的安全訪問通過原子操作(atomic operation)來保證。在前面的例子中,如果兩個控制路徑讀V並減1是一個單獨的,不可中斷的操作,那麼,就不可能出現數據訛誤,然而,核心包含的很多資料結構是無法用單一操作訪問的。例如, 用單一的操作從連結串列中刪除一個元素是不可能的,因為核心一次至少訪問兩個指標。臨界區(cirtical region)是這樣的一段程式碼,進入這段程式碼的程序必須完成,之後另一個程序才能進入()

       這些問題不僅出現在核心控制路徑之間,也出現在共享公共資料的程序之間,幾種同步技術已經被採用。