Linux
為什麼自旋鎖在 Linux 核心設計中是不錯的選擇,而不是在使用者態程式碼中更常見的選擇,例如信號量或互斥鎖?
我知道自旋鎖在 Linux 核心設計中是真正的浪費。
我想知道為什麼在 Linux 核心設計中自旋鎖是不錯的選擇,而不是在使用者態程式碼中更常見的東西,例如信號量或互斥鎖?
自旋鎖和另一個導致呼叫者阻塞和放棄對 cpu 控制的構造之間的選擇在很大程度上取決於執行上下文切換所需的時間(在鎖定執行緒中保存寄存器/狀態並恢復寄存器/狀態在另一個執行緒中)。這樣做所花費的時間以及記憶體成本可能會很大。
如果使用自旋鎖來保護對硬體寄存器或類似的訪問,而任何其他正在訪問的執行緒在釋放鎖之前只需要幾毫秒或更短的時間,那麼它可以更好地利用 cpu 時間來旋轉等待而不是上下文切換並繼續。
正如問題所暗示的那樣,自旋鎖是一種“浪費”,自旋鎖應該只短暫持有。
自旋鎖並不是同步多個執行緒的唯一方法。互斥體/信號量也用於 Linux 核心,其他同步原語(例如等待隊列、事件)也是如此。
然而,核心必須處理使用者空間從未見過的情況,常見的情況是中斷處理程序。中斷處理程序不能在 Linux 上重新調度,但通常必須使用一些同步原語(例如,將工作項添加到其他執行緒將進一步處理的鍊錶)。由於中斷處理程序不能休眠,它們不能使用互斥鎖、等待隊列等。這幾乎留下了自旋鎖。如果執行緒需要與中斷處理程序同步訪問,那麼它也必須使用相同的自旋鎖。
自旋鎖不一定是浪費。它們針對非爭用/非等待情況進行了優化,可以非常快速地獲取和釋放。在這種情況下,它們比其他同步原語更快並且涉及更少的成本。