1. 程式人生 > >Linux驅動開發(13)——併發與原子操作

Linux驅動開發(13)——併發與原子操作

併發

  1. 併發的概念
    多個執行單元同時、並行被執行。Linux系統是多工的,很多工會同時執行。
    假如有三個執行單元ABC,共享了記憶體資源。
    執行單元A對Buffer寫1000個“a”;
    執行單元B對Buffer寫1000個“b”;
    執行單元C從buffer中讀取資料。
    如果按照A寫→C讀→B寫→C讀,當然沒有問題。但是如果A寫→B寫→C讀,執行單元C就出問題了。當然比這個複雜更多,更加混亂的併發操作存在裝置驅動中,只要有多個程序對共享資源的同時訪問,就可能出現競態。
  2. 導致競態的原因
    a. 對稱多處理的多個CPU
    b.單CPU內程序和搶佔它的程序
    c.中斷和程序
  3. 競態的解決方法
    解決競態的途徑是“保證對共享資源的互斥訪問”,也就是一個執行單元在訪問共享資源的時候,其它的執行單元被禁止訪問。訪問共享資源的程式碼區稱為臨界區,臨界區需要使用互斥機制來保護。
  4. Linux作業系統中提供實現互斥的方法:
    原子操作、自旋鎖、訊號量、互斥體等。

整型原子操作

  1. 核心中提供的巨集定義
    atomic_t 整型變數
    atomic_read (*(volatile int *)&(v)->counter)
    atomic_inc atomic_add(1, (v)) 變數加1
    atomic_dec 變數減1

位原子操作

test_bit 返回位原子值
set_bit 設定位
clear_bit 清除位