Linux自旋鎖和互斥鎖的實現

2021-09-14 02:43:14 字數 587 閱讀 8467

自旋鎖(spin lock)應用在多處理器環境中。如果核心控制路徑發現自旋鎖「開著」,就獲取鎖並繼續自己的執行。相反,如果核心控制路徑發現鎖由執行在另乙個cpu上的核心控制路徑「鎖 著」,就在周圍「旋轉」,反覆執行一條緊湊的迴圈指令,直到鎖被釋放。自旋鎖的迴圈指令表示「忙等」。即使等待的核心控制路徑無事可做(除了浪費時間),它也在cpu上保持執行。不過,自旋鎖通常非常方便,因為很多核心資源只鎖1毫秒的時間片段;所以說,等待自旋鎖的釋放不會消耗太多cpu的時間。

一般來說,由自旋鎖所保護的每個臨界區都是禁止核心搶占的。在單處理器系統上,這種鎖本身並不起鎖的作用,自旋鎖技術僅僅是用來禁止或啟用核心搶 佔。請注意,在自旋鎖忙等期間,因為並沒有進入臨界區,所以核心搶占還是有效的,因此,等待自旋鎖釋放的程序有可能被更高優先順序的所取代。這種設計是合理 的,因為不能因為占用cpu太久而使系統死鎖。

互斥鎖(mutex lock)的實現,實際上就是一把鎖維護了乙個等待佇列和乙個引用計數器,當獲取鎖之前,先對引用計數器減1操作,如果為非負,則可以獲取鎖進入臨界區。否則將該任務設為不可中斷狀態(uninterruptible),掛在該等待對列上。獲取鎖的任務從臨界區退出後,計數器加1操作,喚醒(wake up)等待佇列上的被掛起程序。

自旋鎖和互斥鎖

1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...

自旋鎖和互斥鎖

自旋鎖是為實現保護共享資源而提出一種輕量級的鎖機制。自旋鎖屬於互斥鎖的一種,都是為了解決某項資源的互斥使用。理解 執行緒a正在占用cpu使用時,執行緒b也想要占用cpu,但此時a已經加了使用標誌 鎖 那麼b就可以有不同的操作 無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個擁有者,也就說,在任何...

互斥鎖和自旋鎖的區別

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