linux中對spin lock的實現

2021-06-26 18:48:16 字數 2253 閱讀 5738

spinlock在linux中的實現(linux-3.8為原始碼樣本)

一、            uniprocessor & smp 中spinlock實現概述

spinlock在uniprocessor中的實現比較簡單,因為對於程序排程,單cpu不存在多個程序同時處於執行狀態,並且同時對某塊共享資料進行訪問這樣一種可能性。因此也就不需要實現「獲取不到資源就在原地迴圈傻等」這樣乙個操作。對於cpu存在核心搶占機制的,則禁止核心搶占;否則退化為空操作。

spinlock在smp(symmetric multi-processing)中的實現,就包括了在uniprocessor中的「禁止核心搶占」操作,以及「獲取不到資源就在原地迴圈傻等」兩個步驟。

我們可以用一張圖來做更直觀的解釋:

二、            原始碼解讀

l  uniprocessor

ø  層次圖。通常情況下,我們會呼叫spin_lock函式來實現加鎖,而spin_lock函式經過幾個層次的define之後,在uniprocessor相關的標頭檔案中給出了實現:

在__lock中,有兩個函式呼叫,乙個是preempt_disable(),用於禁止核心搶占的;乙個是__acquire(lock),用於申請乙個鎖的。第三個實際上是乙個空函式,正如我們在第一部分分析的,不需要做迴圈機制。

ø  preempt_disable()解讀

可以看到,preempt_disable()就是將乙個當前執行緒的某個變數加了一,原因是:

每個程序的thread_info引入了 preempt_count(threadinfo.preemptcount)計數器。該計數器初始值為

0,每當使用鎖的時候數值加

1,釋放鎖的時候數值減

1。當數值為

0的時候,核心就可執行搶占。從中斷返回核心空間的時候,核心會檢查flag和preempt_count的值。如果flag中tifneedresched被設定,並且preempt_count為0的話,這說明有乙個更為重要的任務需要執行並且可以安全地搶占,此時,排程程式就會排程(搶占當前程序)。如果

preempt_count不為0

,說明當前任務持有鎖,所以搶占是不安全的。這時,就會像通常那樣直接從中斷返回當前執行程序。

如果當前程序所持有的所有的鎖都被釋放了。

那麼preemp_tcount

就會重新為

0。此時,釋放鎖的**會檢查needresched

是否被設定。如果是的話,就會呼叫排程程式。有些核心**需要允許或禁止核心搶占。

ø  解鎖

解鎖過程與加鎖過程類似,幾乎可以對照以上的內容找到相應的**,以及給出解釋,因此這裡就不貼原始碼了。

l  smp

ø  層次圖+粗略講解(由於層次結構比較複雜,就不畫簡略版了,直接在原圖上通過引箭頭的方式表明)

可以看到,對於smp系統,禁止核心搶占部分和uniprocessor是一樣的,debug相關的一些函式可以暫時不看,關注主線函式,對於spinlock的實現,是arch_spin_lock(&lock->raw_lock)函式負責的,這是乙個體繫結構相關的函式,不同體系結構對其有著各自的寫法。接下來以x86為例。

ø  arch_spin_lock(&lock->raw_lock)x86版本解讀

在閱讀原始碼的時候發現,linux-3.13中對這一部分的實現,和linux-3.8有一些差別,但差別不很大。主要是對for迴圈的時間做出了限制:

spinlock與linux核心排程的關係

一 自旋鎖 spinlock 簡介 自旋鎖在同一時刻只能被最多乙個核心任務持有,所以乙個時刻只有乙個執行緒允許存在於臨界區中。這點可以應用在多處理機器 或執行在單處理器上的搶占式核心中需要的鎖定服務。二 訊號量簡介 這裡也介紹下訊號量的概念,因為它的用法和自旋鎖有相似的地方。linux中的訊號量是一...

spinlock與linux核心排程的關係

spinlock與linux核心排程的關係 一 自旋鎖 spinlock 簡介 自旋鎖在同一時刻只能被最多乙個核心任務持有,所以乙個時刻只有乙個執行緒允許存在於臨界區中。這點可以應用在多處理機器 或執行在單處理器上的搶占式核心中需要的鎖定服務。二 訊號量簡介 這裡也介紹下訊號量的概念,因為它的用法和...

spinlock與linux核心排程的關係

關於自旋鎖用法介紹的文章,已經有很多,但有些細節的地方點的還不夠透。我這裡就把我個人認為大家容易有疑問的地方拿出來討論一下。一 自旋鎖 spinlock 簡介 自旋鎖在同一時刻只能被最多乙個核心任務持有,所以乙個時刻只有乙個執行緒允許存在於臨界區中。這點可以應用在多處理機器 或執行在單處理器上的搶占...