作業系統中的鎖的分類

2022-04-28 21:24:14 字數 2176 閱讀 7459

參考:

作業系統中的鎖分為兩大類:悲觀鎖和樂觀鎖。

1. 悲觀鎖

悲觀鎖,pessimistic lock,即這種鎖的「想法」很悲觀——方法執行如果不加鎖就會出事,所以操作必須上鎖,乙個乙個的來。

其中重量級鎖、自旋鎖自適應自旋鎖屬於悲觀鎖。

當進入乙個同步、執行緒安全的方法時,需要先獲得該方法的鎖,而退出這個方法時,則需要釋放鎖。如果執行緒a獲取不到該鎖,則意味著該方法有別的執行緒在執行,這時執行緒a會馬上進入阻塞狀態,直到持有鎖的執行緒釋放鎖,才會從阻塞狀態被喚醒,再嘗試去獲取該方法的鎖。

重量級鎖的特點是:獲取不到鎖,馬上進入阻塞狀態

自旋鎖的特點是:獲取不到鎖,等一段固定時間,再進入阻塞狀態

自適應自旋鎖是在自旋鎖的基礎上,對一段固定時間作出了一些調整:不需要人為去指定這一段固定時間究竟是多久,而是根據執行緒最近獲得鎖的狀態來調整迴圈次數,盡量去減少等待時間,從而減少cpu的消耗。

樂觀鎖,optimistic lock,即這種鎖的「想法」很樂觀——方法執行不用加鎖,要是出現了衝突再想辦法去解決。

不加鎖,就應該用其他的方法去控制方法的同步和執行緒安全,也就是cas機制。

2.1 cas機制

cas,compare and swap,比較並替換。cas機制中採用了3個基本運算元,分別是記憶體位址v、舊預期值a、新值b。當執行緒在更新乙個變數的時候,只有當變數的舊預期值a和記憶體位址v當中的實際值相同時,才會將記憶體位址v對應的值修改為b。

這裡有乙個例子來說明一下cas機制:

有兩個執行緒a、b,都想要將記憶體位址v當中的值加1,記憶體位址v當中的初始值為10。

1、對於執行緒a來說,舊預期值a=10,新值b=11;

2、而當執行緒a提交更新之前,執行緒b搶先一步,將記憶體位址v當中的值加1變成了11;

3、此時,執行緒a開始提交更新,將舊預期值a與記憶體位址v當中的值進行比較,發現不等,提交失敗;

4、執行緒a重新嘗試獲取舊預期值a=11,新值b=12,該重新嘗試的過程被稱為自旋;

5、執行緒a提交更新,舊預期值a與記憶體位址v當中的值相同,提交更新,此時記憶體位址v當中的值更新為b,也就是12。

cas的缺點:

1) cpu開銷過大:在併發量比較高的情況下,如果許多執行緒反覆嘗試更新某乙個變數,卻又一直更新不成功,迴圈往復,會給cpu帶來很到的壓力。

2) 不能保證**塊的原子性:cas機制所保證的只是乙個變數的原子性操作,而不能保證整個**塊的原子性。比如需要保證3個變數共同進行原子性的更新,就不得不使用synchronized了。

3) aba問題:這是cas機制最大的問題所在。通常會採取加入版本號,從而有效的解決aba問題。

其中輕量級鎖偏向鎖屬於樂觀鎖,並使用cas機制來對方法進行相應的標記,從而保證方法的同步和執行緒安全。

輕量級鎖會認為,很少有執行緒剛好也來執行相同的方法,所以,當進入乙個方法的時候根本不用加鎖,只需要做乙個標記,也就是乙個變數,來記錄此時該方法是否有人在執行。當該方法沒有在執行的時候,執行緒進入該方法,採用cas機制,將方法的狀態標記為正在執行,當退出方法的時候,再將狀態標記為沒有在執行。使用cas機制來改變狀態,是因為對狀態的改變並不是原子操作,所以會使用cas機制來保證操作的原子性。

輕量級鎖適合很少出現多個執行緒競爭乙個鎖的情況,即多個執行緒總是錯開時間來獲取鎖的情況。

如果執行緒是首次執行該方法,那麼便會採用cas機制將其標記為有人在執行,同時會將執行緒id記錄進去,以標記是哪個執行緒正在執行。而當執行緒退出該方法的時候,不會改變其狀態,而是直接退出,因為其預設除了本執行緒,其他執行緒並不會執行該方法。這樣當這個執行緒想要再次執行該方法的時候,會判斷其狀態,如果已經被標記為有人在執行並且執行緒的id是自己,那麼就直接執行方法。

偏向鎖適用於始終只有乙個執行緒在執行乙個方法的情況。

兩類鎖並沒有孰好孰壞之分,因為其不同的「想法」,分別會有著它們最合適的應用條件和場景。由於悲觀鎖的「想法」比較悲觀,認為不加鎖就會出錯,因此會阻塞事務。一般來說悲觀鎖會應用於經常發生衝突的時候,通俗來講可以理解為寫多讀少的情況。而樂觀鎖由於「想法」比較樂觀,認為沒有必要加鎖,因此往往會回滾重試。一般來說樂觀鎖會應用於衝突較少發生的時候,通俗理解為讀多寫少的情況,這樣就可以省去鎖的開銷,從而加大系統的吞吐量。

作業系統中的鎖

作業系統內的同步系統,都是使用原子操作實現的。原子操作又是如何實現的呢?一般的作業系統書都是寫使用二值訊號量實現的。即用二值訊號量擋在原子操作的開始和結束,以保護原子操作不被打斷。這個是重要的理論依據,但並不能指導實踐。因為,二值訊號量其實就是對乙個標誌位置位,當然,在置位前必須測試一下二值訊號量。...

作業系統中不同的鎖

鎖是執行緒同步時的乙個重要的工具,然而作業系統中包含了多種不同的鎖,各種鎖之間有什麼不同呢?1 訊號量 semaphore 訊號量分為二元訊號量和多元訊號量,所謂二元訊號量就是指該訊號量只有兩個狀態,要麼被占用,要麼空閒 而多元訊號量則允許同時被n個執行緒占有,超出n個外的占用請求將被阻塞。訊號量是...

作業系統的分類

傳統作業系統分類 待完善 1 批處理 2 分時 3 實時 4 個人計算機 5 網路 6 分布式 7 嵌入式 批處理作業系統 作業包括 使用者程式,資料,作業說明書。成批 通常由若干個作業組成,使用者只能提交等待處理,不能干預自己作業處理。spooling系統工作原理 使用者作業載入到磁碟上的輸入井 ...