操作系統(一)—— 進程同步
前言
下一篇章打算講解 AQS ,在去熟悉 AQS 原理之前,我想我們得知道一個事物是因何而產生,它出現的動機;AQS 作為一種高級的同步機制,討論 AQS 則避免不了談及操作系統以及 Java 實現的其他同步機制,正是因為其他同步機制存在一些缺陷或是限制才會有 AQS;由于同步機制的篇幅并不短,因此單獨開一文進行闡述。
概念介紹
臨界區
Consider a system consisting of n processes {P0, P1, ..., Pn?1}. Each process has a segment of code, called a critical section, in which the process may be accessing — and updating — data that is shared with at least one other process.
當多個進程訪問(包含線程,此文以進程來講解,后續只說進程)共享資源時,這些進程訪問共享資源的代碼就稱作臨界區。臨界區的關鍵是在同一時刻只能有一個進程執行臨界區。
臨界資源
在同一時刻只能允許一個進程訪問的共享資源稱作臨界資源。同一時刻只能允許一個進程訪問,即是因為有多個進程同時訪問共享資源會造成錯誤,如多個進程調度打印機,多個進程需要有序執行,當一個進程執行完畢下一個線程才能執行,否則打出來的內容就串了;
進程之間的制約
- 直接制約:當一個進程訪問臨界資源結束后,另一個進程依賴于上一個進程的計算結果,例如做 count++ 操作,如果沒有次序依賴保證,加出來的結果就可能是錯誤的。
- 間接制約:即上面舉的打印機的例子,即使兩個線程之間沒有數據依賴關系,但是并不能同時執行,否則會出現錯誤。
互斥
互斥即間接制約,線程訪問共享資源相互排斥,互斥強調的是搶占
同步
同步即直接制約,同步強調的是協作
同步和互斥通常成對出現,但是很明顯,同步也實現了互斥,通常意義上我們說的同步即涵蓋了同步和互斥,下文則只說同步,就不說同步互斥。
進程同步工具
為何需要進程同步?
多進程協作下,多個進程共享邏輯空間,可以訪問到共享的資源,在并發訪問的情況下會出現數據的不一致,所以需要引入同步機制對進程訪問做順序的控制。
Mutex
Mutex 又稱互斥鎖,互斥鎖提供一個狀態變量、加鎖解鎖操作、等待隊列。進程在進入臨界區之前先進行加鎖操作,且變更鎖的狀態表明鎖不可用,當其他進程想要進入臨界區的時候同樣要進行加鎖操作,但因鎖不可用所以加鎖失敗,需要等待獲得鎖的線程釋放鎖之后才能加鎖成功,如此便保證了進程互斥的進入臨界區。
等待隊列不是必須的,可以使用自旋替代,即當線程獲取鎖失敗的時候進行空轉等待鎖釋放,這有個好處是可以避免兩次上下文切換,但是由于空轉沒有釋放 CPU ,影響其他進程處理任務,所以通常互斥鎖都會提供一個等待隊列,等待是廣泛意義上說的等待,線程可以處于 wait 狀態也可以是 block 狀態。
Semaphore
Semaphore 即信號量,信號量是根據資源數量對進程進行狀態管理的一種機制,信號量在狹義上可以指這個機制中的整型數,信號量提供一個大于零的整型數和兩個操作。兩個操作是 wait() 和 signal(), 在 Dijkstra 提出這個概念的時候這兩個操作也叫做 P 操作和 V 操作。信號量機制的工作原理是初始化一個整數為可以訪問的共享資源的數量,當進程需要訪問臨界資源的時候先進行 P 操作,表明占據了一個資源,當使用完畢后進行 V 操作釋放資源,P 操作會對整數減 1,V 操作對整數加 1,如果該整數為 0,那么進程就無法訪問資源。
信號量分為兩種:
- 互斥信號量, 信號量的值為 0 或 1,也叫二進制信號量
- 計數信號量,信號量使用一個較大的范圍,介于 0~n 之間
Monitor
Monitor 在操作系統中也被譯作管程,管程是高級操作。Semaphore 和 Mutex 都是低級操作,為操作系統層面的實現,通常用來構建更高級的同步工具。信號量和互斥鎖的使用都比較復雜,使用不當很容易造成錯誤。管程即是為了解決信號量這種狀態和操作分散且由應用程序員控制的問題,管程的思想是將數據、變量、操作封裝到一個模塊,可以理解為對信號量的操作和數據的封裝,避免信號量中PV操作配對錯誤的情況。管程通過限制同一時刻只能有一個進程(線程)進入管程來達到互斥的目的。管程在 Java 中的實現以 HotSpot 為例是 ObjectMonitior.cpp,具體應用體現在 Synchronized 關鍵字,關于 Monitor 的詳情可以見多線程與高并發(一)—— 自頂向下理解Synchronized實現原理
參考資料
[1] 《Operating System Concepts (Abraham Silberschatz, Greg Gagne etc.)》

浙公網安備 33010602011771號