Linux 核心的排隊自旋鎖

2021-04-18 06:06:42 字數 939 閱讀 1133

引言

自旋鎖(spinlock)是一種 linux 核心中廣泛運用的底層同步機制。自旋鎖是一種工作於多處理器環境的特殊的鎖,在單處理環境中自旋鎖的操作被替換為空操作。當某個處理器上的核心執行執行緒申請自旋鎖時,如果鎖可用,則獲得鎖,然後執行臨界區操作,最後釋放鎖;如果鎖已被占用,執行緒並不會轉入睡眠狀態,而是忙等待該鎖,一旦鎖被釋放,則第乙個感知此資訊的執行緒將獲得鎖。

長期以來,人們總是關注於自旋鎖的安全和高效,而忽視了自旋鎖的「公平」性。傳統的自旋鎖本質上用乙個整數來表示,值為1代表鎖未被占用。這種無序競爭的本質特點導致執行執行緒無法保證何時能取到鎖,某些執行緒可能需要等待很長時間。隨著計算機處理器個數的不斷增長,這種「不公平」問題將會日益嚴重。

排隊自旋鎖(fifo ticket spinlock)是 linux 核心 2.6.25 版本引入的一種新型自旋鎖,它通過儲存執行執行緒申請鎖的順序資訊解決了傳統自旋鎖的「不公平」問題。排隊自旋鎖的**由 linux 核心開發者 nick piggin 實現,目前只針對 x86 體系結構(包括 ia32 和 x86_64),相信很快就會被移植到其它平台。

回頁首

傳統自旋鎖的實現與不足

linux 核心自旋鎖的底層資料結構 raw_spinlock_t 定義如下:

清單 1. raw_spinlock_t 資料結構

typedef struct raw_spinlock_t;

slock 雖然被定義為無符號整數,但是實際上被當作有符號整數使用。slock 值為 1 代表鎖未被占用,值為 0 或負數代表鎖被占用。初始化時 slock 被置為 1。

執行緒通過巨集 spin_lock 申請自旋鎖。如果不考慮核心搶占,則 spin_lock 呼叫 __raw_spin_lock 函式,**如下所示:

本文**ibm developerworks中國

Linux 核心自旋鎖

現在很多cpu都是幾核幾核的了,如果有乙個變數a,cpu x正在訪問,突然cpu y也過來訪問他,這時候就可能出現問題,因為這個a非常重要,可能導致系統崩潰,中斷異常等。我們來看之前說的tp驅動裡面的 void gtp irq enable struct goodix ts data ts spin...

核心 自旋鎖

自旋鎖用於多處理器環境下保護資料。如果核心發現資料未鎖,就獲取鎖並執行 如果資料被鎖,就一直旋轉 反覆執行一條指令 自旋鎖在單處理器環境下 非搶占式核心 下,不起作用 單處理器搶占式核心的情況下,自旋鎖起到禁止搶占的作用。注釋 核心搶占 可搶占式核心 即當程序位於核心空間時,有乙個更高優先順序的任務...

Linux核心 什麼是自旋鎖

linux核心最常見的鎖是自旋鎖 spin lock 自旋鎖最多只能被乙個可執行執行緒持有。如果乙個執行緒試圖獲得乙個被已經持有的自旋鎖,那麼該執行緒就會一直進行忙 迴圈 旋轉 等待鎖重新可用。要是鎖未被爭用,請求鎖的執行執行緒便能立即得到他,繼續執行。在任意時間,自旋鎖都可以防止多於乙個的執行執行...