天天看點

自旋鎖(spin lock)學習目的用途與互斥鎖差別原理可能出現的問題使用場景

目錄

目的

用途

與互斥鎖差別

相同點

不同點

原理

可能出現的問題

死鎖(騎驢找驢)

過多占用cpu資源

使用場景

目的

為了防止多處理器并發,保護共享資源。

用途

在核心中大量用于中斷處理。

對于單處理器,防止中斷進行中的并發可以采用關閉中斷的方式(标志寄存器中的中斷标志位)

與互斥鎖差別

相同點

  • 為保護共享資源提出的鎖機制:為了解決對某項資源的互斥使用。
  • 在任何時刻,最多隻能有一個執行單元獲得鎖。
  • 一個執行單元要想通路被鎖保護的共享資源,必須先得到鎖,在通路完共享資源後,必須釋放鎖。

不同點

排程機制上不同:

對于互斥鎖,如果資源已被占用,資源申請者隻能進入睡眠狀态。但是自旋鎖不會引起調用者睡眠,如果自旋鎖已被别的執行單元保持,調用者就一直循環等待。

原理

過程:

  1. 擷取鎖
  2. 通路共享資源
  3. 釋放鎖

如果在擷取自旋鎖時,沒有任何執行單元保持該鎖,那麼将立即擷取鎖。

如果在擷取鎖時已經有持有者,那麼鎖操作将自旋,直到自旋鎖的保持者釋放了鎖。

可能出現的問題

死鎖(騎驢找驢)

試圖遞歸地獲得自旋鎖必然會引起死鎖:

遞歸程式的持有執行個體在第二個執行個體循環,以試圖獲得相同自旋鎖時,不會釋放此自旋鎖。

在遞歸程式中使用自旋鎖應遵守下列政策:

  1. 遞歸程式決不能在持有自旋鎖時調用它自己
  2. 決不能在遞歸調用時試圖獲得相同的自旋鎖

此外如果一個程序已經将資源鎖定,那麼,即使其它申請這個資源的程序不停地瘋狂“自旋”,也無法獲得資源,進而進入死循環。

過多占用cpu資源

如果不加限制,由于申請者一直在循環等待,是以自旋鎖在鎖定的時候,如果不成功,不會睡眠,會持續的嘗試,單cpu的時候自旋鎖會讓其它process動不了. 是以,一般自旋鎖實作會有一個參數限定最多持續嘗試次數. 超出後, 自旋鎖放棄目前time slice. 等下一次機會。

使用場景

自旋鎖比較适用于鎖使用者保持鎖時間比較短的情況。

正是由于自旋鎖使用者一般保持鎖時間非常短,是以選擇自旋而不是睡眠是非常必要的,自旋鎖的效率遠高于互斥鎖。

信号量和讀寫信号量适合于保持時間較長的情況,它們會導緻調用者睡眠,是以隻能在程序上下文使用,而自旋鎖适合于保持時間非常短的情況,它可以在任何上下文使用。如果被保護的共享資源隻在程序上下文通路,使用信号量保護該共享資源非常合适,如果對共享資源的通路時間非常短,自旋鎖也可以。但是如果被保護的共享資源需要在中斷上下文通路(包括底半部即中斷處理句柄和頂半部即軟中斷),就必須使用自旋鎖。自旋鎖保持期間是搶占失效的,而信号量和讀寫信号量保持期間是可以被搶占的。自旋鎖隻有在核心可搶占或SMP(多處理器)的情況下才真正需要,在單CPU且不可搶占的核心下,自旋鎖的所有操作都是空操作。

總之,自旋鎖是一種對多處理器相當有效的機制,而在單處理器非搶占式的系統中基本上沒有作用。自旋鎖在SMP系統中應用得相當普遍。

在許多SMP系統中,允許多個處理機同時執行目态程式,而一次隻允許一個處理機執行作業系統代碼,利用一個自旋鎖可以很容易實作這種控制.一次隻允許一個CPU執行核心代碼并發性不夠高,若期望核心程式在多CPU之間的并行執行,将核心分為若幹相對獨立的部分,不同的CPU可以同時進入和執行核心中的不同部分,實作時可以為每個相對獨立的區域設定一個自旋鎖. 

自旋鎖的基本形式如下:

spin_lock(&mr_lock);

//臨界區

spin_unlock(&mr_lock);

繼續閱讀