(Linux內核同步機制之自旋鎖)
我們已經分析了Linux內核同步機制的信號量,發現信號量其實是基於自旋鎖來實現的,現在我們就來看看Linux內核中的自旋鎖吧!
那麼自旋鎖有什麼特性呢?
自旋鎖最多隻能夠被一個可執行線程持有,如果一個執行線程試圖獲得一個已經被持有的自旋鎖,那麼該線程就會一直進行忙等待,直到自旋鎖被釋放重新可用;如果鎖沒有被持有,請求自旋鎖的線程便能立刻得到它,繼續執行。那麼何爲線程呢?線程也就是CPU調度執行的最小單位,一個單獨的執行流。 在任意時間,自旋鎖都可以防止多於一個的執行線程同事進入臨界區,同時,同一個鎖可以用在多個位置上。
自旋鎖數據結構如下:
1 typedef struct {
2 raw_spinlock_t raw_lock;
3 #ifdef CONFIG_GENERIC_LOCKBREAK
4 unsigned int break_lock;
5 #endif
6 #ifdef CONFIG_DEBUG_SPINLOCK
7 unsigned int magic, owner_cpu;
8 void *owner;
9 #endif
10 #ifdef CONFIG_DEBUG_LOCK_ALLOC
11 struct lockdep_map dep_map;
12 #endif
13 } spinlock_t;
自旋鎖定義也提供靜態和動態方式。
DEFINE_SPINLOCK(x)
該宏聲明一個自旋鎖x並初始化它。
SPIN_LOCK_UNLOCKED
這個宏也用於初始化一個自旋鎖。
DEFINE_SPINLOCK(x)等同於spinlock_t x = SPIN_LOCK_UNLOCKED
下一篇繼續講解自旋鎖的操作API。