標籤:
本文將就自己對核心同步機制的一些簡要理解,做出一份自己的總結文檔。
Linux內部,為了提供對共用資源的互斥訪問,提供了一系列的方法,下面簡要的一一介紹。
Technorati 標籤: 互斥 Linux 中斷屏蔽
使用方法:
local_irq_disable() //屏蔽中斷 critical section //臨界區local_irq_enable() //開中斷
原因:Linux核心的進程調度依賴時鐘中斷實現,如果禁止中斷,核心就不會調度其他程式,因此,可以保證正在執行的核心路徑不會被中斷服務程式打斷。
缺點:
1. local_irq_disable 和 local_irq_enable 只能禁止和使能本地CPU內中斷,對於多CPU的SMP情況,無法解決此類競爭。
2. 屏蔽中斷期間,內部一些非同步I/O、進程調度無法進行,有可能造成資料丟失等問題。
變體:local_irq_save(flags),在屏蔽本地CPU中斷的基礎上,備份禁止中斷之前的CPU標誌位,可通過local_irq_restore來恢複。
原子操作
原子操作是核心實現並且保證的最小執行單元,如果需要保護的臨界資源為單一變數,可以考慮這種輕量級的保護方式。
核心提供 對於整形數的原子操作和 對於某一位的原子操作。
自旋鎖
自旋鎖,從名字上可以知道,這個函數將會自我原地旋轉,直到某一條件符合要求,如符合要求,則說明鎖已經開啟,可以進入,若不符合要求,則自己原地轉個圈,轉完後繼續判斷條件是否符合要求。
最簡單的使用方法如下:
spinlock_t lock; spin_lock_init(&lock); spin_lock (&lock); ... //臨界區 spin_unlock(&lock);
自旋鎖,對不可搶佔核心,
RCU------讀-----------寫
無鎖訪問 寫(向拷貝副本中寫)
更新(延遲到對該資料的所有讀操作完成為止)
wait_event <-----> wake_up
相關變體:
wait_event_interrupitble <----> wake_up_interruptible
Linux 核心同步機制