作業系統 自旋鎖(spin)與互斥鎖(mutex)

2022-10-09 07:42:09 字數 522 閱讀 6680

程式在多處理器上執行會因為,多個執行緒同時進行,而導致喪失語句的原子性。

例如讀和寫的操作是分開的,不能保證同時完成。

所以軟體不夠用硬體來湊,通過硬體實現一條指令完成讀寫:這就是自旋鎖。

可以理解為乙個房間門口桌上只放一把鑰匙,每次有人想進就用其他東西交換鑰匙,

拿到鑰匙才能進入房間,拿不到鑰匙的就重複嘗試交換鑰匙,直到獲得鑰匙進入。

因為鑰匙只有一把,同時只有乙個人能交換到鑰匙,就實現了原子性。

自旋鎖優點在於只使用一條語句,開銷很低,缺點在於,其他程序會反覆嘗試浪費cpu資源。即上限高,下限低。

而互斥鎖則是某個人在交換鑰匙失敗後,就去睡覺,直到鑰匙已經放回來時喚醒。

互斥鎖優點在於,減少cpu資源空轉,缺點在於,睡眠喚醒都要進入核心。即下限高,上限低。

自然而然,我們會想全都要,既要高上限,又要高下限。

因此可以將兩種鎖結合使用。如futex。

上鎖成功直接返回,上限高。上鎖失敗,執行系統呼叫休眠,下限高。

自旋鎖和互斥鎖就是各種高階鎖的地基。

作業系統 互斥鎖 自旋鎖 讀寫鎖 悲觀鎖 樂觀鎖

使用場景 如果你能確定被鎖住的 執行時間很長,就不應該用互斥鎖 加鎖的目的就是保證共享資源在任意時間裡,只有乙個執行緒訪問,這樣就可以避免多執行緒導致共享資料錯亂的問題。互斥鎖加鎖失敗後,執行緒會釋放 cpu 給其他執行緒,自身處於獲取鎖阻塞狀態,然後從使用者態切換到核心態由由核心幫助進行切換執行緒...

互斥鎖與自旋鎖

一 互斥鎖 當鎖時可用的,呼叫上鎖的api會成功,並且將鎖設定為不再可用。當乙個程序嘗試獲取不可用的鎖的時候它會阻塞,直到鎖被釋放。進入臨界區時獲得鎖,退出臨界區時釋放鎖。二 自旋鎖 是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲...

自旋鎖與互斥鎖

互斥鎖,就是悲觀鎖,保證乙個執行緒進去。執行緒會從sleep 加鎖 runng 解鎖 過程中有上下文的切換,cpu的搶占,訊號的傳送等開銷。自旋鎖 執行緒一直都是running 加鎖 解鎖 死迴圈檢測鎖位的標誌位,機制不複雜。自旋鎖 由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋鎖而不是睡眠是非...