競爭條件、臨界區和訊號量
競爭條件、臨界區和訊號量是作業系統的關鍵部分。關於這些的詳細資訊如下所示:
競爭條件
競爭條件是在臨界區內可能發生的一種情況。當在臨界區中多個執行緒執行的結果根據執行緒執行的順序而不同時,就會發生這種情況。
如果將臨界區視為原子指令,則可以避免臨界區中的競爭條件。此外,使用鎖或原子變數進行適當的執行緒同步可以防止競爭條件。
臨界區
程式碼段中的臨界區,其中可以訪問共享變數。臨界區需要原子操作,即一次只能有一個程序在其臨界區中執行。所有其他程序都必須等待才能在其臨界區中執行。
臨界區如下所示
do{ Entry Section Critical Section Exit Section Remainder Section } while (TRUE);
在上圖中,入口段處理進入臨界區的操作。它獲取程序執行所需的資源。退出段處理退出臨界區的操作。它釋放資源,並通知其他程序臨界區已釋放。
臨界區問題需要一個解決方案來同步不同的程序。臨界區問題的解決方案必須滿足以下條件:
- 互斥
互斥意味著在任何時間只能有一個程序在臨界區內。如果任何其他程序需要臨界區,則它們必須等待直到它可用。
- 進展
進展意味著如果一個程序未使用臨界區,則它不應阻止任何其他程序訪問它。換句話說,如果臨界區可用,任何程序都可以進入臨界區。
- 有界等待
有界等待意味著每個程序都必須具有有限的等待時間。它不應無限期地等待訪問臨界區。
訊號量
訊號量是一種訊號機制,等待訊號量的執行緒可以由另一個執行緒發出訊號。這與互斥體不同,因為互斥體只能由呼叫 wait 函式的執行緒發出訊號。
訊號量使用兩個原子操作(wait 和 signal)進行程序同步。
如果 wait 操作的引數 S 為正,則它會遞減 S 的值。如果 S 為負或零,則不執行任何操作。
wait(S){ while (S<=0); S--; }
signal 操作會遞增其引數 S 的值。
signal(S){ S++; }
廣告