Linux 中的自旋鎖是什麼?
我想詳細了解 Linux 自旋鎖;有人可以向我解釋嗎?
自旋鎖是一種保護共享資源不被兩個或多個程序同時修改的方法。嘗試修改資源的第一個程序“獲取”鎖並繼續前進,對資源執行所需的操作。隨後嘗試獲取鎖的任何其他程序都會停止;據說它們“原地自旋”等待第一個程序釋放鎖,因此稱為自旋鎖。
Linux 核心在很多事情上都使用自旋鎖,例如在向特定外圍設備發送數據時。大多數硬體外圍設備並非旨在處理多個同時狀態更新。如果必須進行兩種不同的修改,一種必須嚴格遵循另一種,它們不能重疊。自旋鎖提供了必要的保護,確保一次修改一次。
自旋鎖是一個問題,因為自旋會阻止該執行緒的 CPU 核心執行任何其他工作。雖然 Linux 核心確實為在其下執行的使用者空間程序提供了多任務處理服務,但該通用多任務處理工具並未擴展到核心程式碼。
這種情況正在發生變化,並且在 Linux 存在的大部分時間裡都是如此。在 Linux 2.0 之前,核心幾乎是純粹的單任務程序:每當 CPU 執行核心程式碼時,只使用一個 CPU 核心,因為有一個自旋鎖保護所有共享資源,稱為大核心鎖 (BKL )。從 Linux 2.2 開始,BKL 慢慢地被分解成許多獨立的鎖,每個鎖保護一個更集中的資源類別。今天,在核心 2.6 中,BKL 仍然存在,但它只被真正舊的程式碼使用,這些程式碼不能輕易地移動到更細粒度的鎖中。現在,多核機器很可能讓每個 CPU 都執行有用的核心程式碼。
由於 Linux 核心缺乏通用的多任務處理,因此分解 BKL 的效用是有限的。如果 CPU 核心在核心自旋鎖上被阻止旋轉,則它不能被重新分配任務,去做其他事情,直到鎖被釋放。它只是坐著旋轉直到鎖被釋放。
如果工作負載使得每個核心總是在等待一個自旋鎖,自旋鎖可以有效地將一個巨大的 16 核盒子變成一個單核盒子。這是 Linux 核心可擴展性的主要限制:將 CPU 核心從 2 個加倍到 4 個可能會使 Linux 機器的速度幾乎提高一倍,但對於大多數工作負載,將其從 16 個加倍到 32 個可能不會。