Linux核心自旋鎖使用筆記

amc發表於2019-05-14

Reference:
spin_lock_bh()與spin_unlock_bh()
Linux核心自旋鎖
Linux自旋鎖
Spinlock – Wikipedia, the free encyclopedia

本文地址:https://segmentfault.com/a/1190000005354100


原理

首先,spinlock是一把鎖,它的功能與其他鎖的作用類似,都是對用於臨界區進行原子讀寫。使用這把鎖時,原理上就是不停的迴圈檢查鎖的狀態,直到可用的時候進入臨界區。

與mutex的區別

Spinlock只進行虛幻檢查,在核心中仍然允許搶佔。
Mutex會立即引起排程,因而在一些中斷處理函式中會出問題。

注意:
  由於是迴圈檢查而已,因此臨界區的大小應該限制,否則非常影響效率。
  選擇自旋鎖時,要注意考慮中斷(軟中斷與硬中斷;timer中斷屬於軟中斷)

函式和巨集定義

標頭檔案

#include <linux/spinlock.h>

靜態初始化

spinlock_t a_lock = SPIN_LOCK_UNLOCKED;

巨集定義和函式

動態初始化:

spin_lock_init(&a_lock);

判斷自旋鎖是否上鎖:

spin_is_locked(&a_lock);

等待直到spinlock解鎖

spin_unlock_wait(&a_lock);

進入和退出臨界區

spin_lock(&a_lock);
spin_unlock(&a_lock);

儲存狀態暫存器值地進入和退出臨界區

int flags;
spin_lock_irqsave(&a_lock, flags);
spin_unlock_irqrestore(&a_lock, flags);

遮蔽硬體中斷地進入和退出臨界區

spin_lock_irq(&a_lock);
spin_unlock_irq(&a_lock);

遮蔽底半部中斷地進入和退出臨界區

spin_lock_bh(&a_lock);
spin_unlock_bh(&a_lock);

相關文章