linux kernel同步方法的总结
文章目錄
- 1、原子操作
- 2、自旋鎖、讀寫自旋鎖
- 3、信號量、讀寫信號量、互斥體
- 4、完成量
- 5、大內核鎖
- 6、順序鎖
- 7、禁止搶占
- 8、順序和屏障
1、原子操作
2、自旋鎖、讀寫自旋鎖
(自旋鎖)
spin_lock() 獲取指定的自旋鎖
spin_lock_irq() 禁止本地中斷并獲取指定的鎖
spin_lock_irqsave() 保存本地中斷的當前狀態,禁止本地中斷,并獲取指定的鎖
spin_unlock() 釋放指定的鎖
spin_unlock_irq() 釋放指定的鎖,并激活本地中斷
spin_unlock_irqstore() 釋放指定的鎖,并讓本地中斷恢復到以前狀態
(讀自旋鎖)
read_lock() 獲取指定的讀鎖
read_lock_irq() 禁止本地中斷并獲得指定讀鎖
read_lock_irqsave() 存儲本地中斷的當前狀態,禁止本地中斷并獲得指定讀鎖
read_unlock() 釋放指定的讀鎖
read_unlock_irq() 釋放指定的讀鎖并激活本地中斷
read_unlock_irqrestore() 釋放指定的讀鎖并將本地中斷恢復到指定前的狀態
(寫自旋鎖)
write_lock() 獲得指定的寫鎖
write_lock_irq() 禁止本地中斷并獲得指定寫鎖
write_lock_irqsave() 存儲本地中斷的當前狀態,禁止本地中斷并獲得指定寫鎖
write_unlock() 釋放指定的寫鎖
write_unlock_irq() 釋放指定的寫鎖并激活本地中斷
write_unlock_irqrestore() 釋放指定的寫鎖并將本地中斷恢復到指定前的狀態
3、信號量、讀寫信號量、互斥體
(信號量)
down_interruptible(struct semaphore *) 以試圖獲得指定的信號量,如果信號量已被爭用,則進入可中斷睡眠狀態
down(struct semaphore *) 以試圖獲得指定的信號量,如果信號量已被爭用,則進入不可中斷睡眠狀態
up(struct semaphore *) 以釋放指定的信號量,如果睡眠隊列不空,則喚醒其中一個任務
(讀寫信號量)
讀寫信號量和信號量之間的關系 與 讀寫自旋鎖和普通自旋鎖之間的關系 差不多。
讀寫信號量都是二值信號量,即計數值最大為1,增加讀者時,計數器不變,增加寫者,計數器才減一。
也就是說讀寫信號量保護的臨界區,最多只有一個寫者,但可以有多個讀者。
讀寫信號量的相關內容參見:<asm/rwsem.h> 具體實現與硬件體系結構有關
(互斥體)
mutex_lock(struct mutex *)
mutex_unlock(struct mutex *)
4、完成量
wait_for_completion(struct completion *)
complete(struct completion *)
5、大內核鎖
大內核鎖已經不再使用,只存在與一些遺留的代碼中.
???
6、順序鎖
7、禁止搶占
preempt_disable() 增加搶占計數值,從而禁止內核搶占
preempt_enable() 減少搶占計算,并當該值降為0時檢查和執行被掛起的需調度的任務
8、順序和屏障
rmb() 阻止跨越屏障的載入動作發生重排序
read_barrier_depends() 阻止跨越屏障的具有數據依賴關系的載入動作重排序
wmb() 阻止跨越屏障的存儲動作發生重排序
mb() 阻止跨越屏障的載入和存儲動作重新排序
smp_rmb() 在SMP上提供rmb()功能,在UP上提供barrier()功能
smp_read_barrier_depends() 在SMP上提供read_barrier_depends()功能,在UP上提供barrier()功能
smp_wmb() 在SMP上提供wmb()功能,在UP上提供barrier()功能
smp_mb() 在SMP上提供mb()功能,在UP上提供barrier()功能
barrier() 阻止編譯器跨越屏障對載入或存儲操作進行優化
總結
以上是生活随笔為你收集整理的linux kernel同步方法的总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Skill]-Markdown编辑器技
- 下一篇: [ARM-assembly]-A64指令