Linux驅動開發(13)——併發與原子操作
阿新 • • 發佈:2018-11-04
併發
- 併發的概念
多個執行單元同時、並行被執行。Linux系統是多工的,很多工會同時執行。
假如有三個執行單元ABC,共享了記憶體資源。
執行單元A對Buffer寫1000個“a”;
執行單元B對Buffer寫1000個“b”;
執行單元C從buffer中讀取資料。
如果按照A寫→C讀→B寫→C讀,當然沒有問題。但是如果A寫→B寫→C讀,執行單元C就出問題了。當然比這個複雜更多,更加混亂的併發操作存在裝置驅動中,只要有多個程序對共享資源的同時訪問,就可能出現競態。 - 導致競態的原因
a. 對稱多處理的多個CPU
b.單CPU內程序和搶佔它的程序
c.中斷和程序 - 競態的解決方法
解決競態的途徑是“保證對共享資源的互斥訪問”,也就是一個執行單元在訪問共享資源的時候,其它的執行單元被禁止訪問。訪問共享資源的程式碼區稱為臨界區,臨界區需要使用互斥機制來保護。 - Linux作業系統中提供實現互斥的方法:
原子操作、自旋鎖、訊號量、互斥體等。
整型原子操作
- 核心中提供的巨集定義
atomic_t 整型變數
atomic_read (*(volatile int *)&(v)->counter)
atomic_inc atomic_add(1, (v)) 變數加1
atomic_dec 變數減1
位原子操作
test_bit 返回位原子值
set_bit 設定位
clear_bit 清除位