悟空學Linux專欄----第48篇

  (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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章