自旋鎖與互斥鎖的區別

2021-08-28 08:28:54 字數 1248 閱讀 1425

自旋鎖(spin lock)

自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是 否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。其作用是為了解決某項資源的互斥使用。因為自旋鎖不會引起呼叫者睡眠,所以自旋鎖的效率遠 高於互斥鎖。雖然它的效率比互斥鎖高,但是它也有些不足之處:

1、自旋鎖一直占用cpu,他在未獲得鎖的情況下,一直執行--自旋,所以占用著cpu,如果不能在很短的時 間內獲得鎖,這無疑會使cpu效率降低。

2、在用自旋鎖時有可能造成死鎖,當遞迴呼叫時有可能造成死鎖,呼叫有些其他函式也可能造成死鎖,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我們要慎重使用自旋鎖,自旋鎖只有在核心可搶占式或smp的情況下才真正需要,在單cpu且不可搶占式的核心下,自旋鎖的操作為空操作。自旋鎖適用於鎖使用者保持鎖時間比較短的情況下。

兩種鎖的加鎖原理

互斥鎖:執行緒會從sleep(加鎖)——>running(解鎖),過程中有上下文的切換,cpu的搶占,訊號的傳送等開銷。

自旋鎖:執行緒一直是running(加鎖——>解鎖),死迴圈檢測鎖的標誌位,機制不複雜。

互斥鎖屬於sleep-waiting型別的鎖。例如在乙個雙核的機器上有兩個執行緒(執行緒a和執行緒b),它們分別執行在core0和 core1上。假設執行緒a想要通過pthread_mutex_lock操作去得到乙個臨界區的鎖,而此時這個鎖正被執行緒b所持有,那麼執行緒a就會被阻塞 (blocking),core0 會在此時進行上下文切換(context switch)將執行緒a置於等待佇列中,此時core0就可以執行其他的任務(例如另乙個執行緒c)而不必進行忙等待。而自旋鎖則不然,它屬於busy-waiting型別的鎖,如果執行緒a是使用pthread_spin_lock操作去請求鎖,那麼執行緒a就會一直在 core0上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止。

兩種鎖的區別

互斥鎖的起始原始開銷要高於自旋鎖,但是基本是一勞永逸,臨界區持鎖時間的大小並不會對互斥鎖的開銷造成影響,而自旋鎖是死迴圈檢測,加鎖全程消耗cpu,起始開銷雖然低於互斥鎖,但是隨著持鎖時間,加鎖的開銷是線性增長。

兩種鎖的應用

互斥鎖用於臨界區持鎖時間比較長的操作,比如下面這些情況都可以考慮

1 臨界區有io操作

2 臨界區**複雜或者迴圈量大

3 臨界區競爭非常激烈

4 單核處理器

至於自旋鎖就主要用在臨界區持鎖時間非常短且cpu資源不緊張的情況下,自旋鎖一般用於多核的伺服器。

互斥鎖與自旋鎖

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

自旋鎖與互斥鎖

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

互斥鎖和自旋鎖的區別

自旋鎖 spin lock 自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是 否該自旋鎖的保持者已經釋放了鎖,自旋 一詞就是因此而得名。其作用是為了解決某項資源的互斥使用。因為自旋鎖不會引起呼叫者睡眠,所以自旋鎖的效率遠 高於互斥鎖。...