7.4 原子操作
原子操作指的是在執行過程中不會被別的**路徑所中斷的操作。linux核心提供一系列函式來實現核心中的原子操作,這些函式分為兩類,分別針對位和整型變數進行原子操作。位和整型變數的原子操作都依賴於底層cpu的原子操作,因此所有這些函式都與cpu架構密切相關。
原子操作主要用於實現資源計數,很多引用計數(refcnt)就是通過原子操作實現的。
7.4.1
整型原子操作
1.設定原子變數的值
void atomic_set(atomic_t *v, int i); /* 設定原子變數的值為 i */
atomic_t v = atomic_init(0); /* 定義原子變數 v 並初始化為 0 */
2.獲取原子變數的值
atomic_read(atomic_t *v); /* 返回原子變數的值 */
3.原子變數加/減
void atomic_add(int i, atomic_t *v); /* 原子變數增加 i */
void atomic_sub(int i, atomic_t *v); /* 原子變數減少 i */
4.原子變數自增/自減
void atomic_inc(atomic_t *v); /* 原子變數增加 1 */
void atomic_dec(atomic_t *v); /* 原子變數減少 1 */
5.操作並測試
int atomic_inc_and_test(atomic_t *v);
int atomic_dec_and_test(atomic_t *v);
int atomic_sub_and_test(int i, atomic_t *v);
上述操作對原子變數執行自增、自減和減操作後
(注意沒有加)
,測試其是否為0,為0返回true,否
則返回false。
6.操作並返回
int atomic_add_return(int i, atomic_t *v);
int atomic_sub_return(int i, atomic_t *v);
int atomic_inc_return(atomic_t *v);
int atomic_dec_return(atomic_t *v);
上述操作對原子變數進行加/減和自增/自減操作,並返回新的值。
7.4.2
位原子操作
1.設定位
void set_bit(nr, void *addr);
設定addr位址的第nr位,所謂設定位即是將位寫為1。
2.清除位
void clear_bit(nr, void *addr);
清除addr位址的第nr位,所謂清除位即是將位寫為0。
3.改變位
void change_bit(nr, void *addr);
對addr位址的第nr位進行反置。
4.測試位
test_bit(nr, void *addr);
返回addr位址的第nr位。
5.測試並操作位
int test_and_set_bit(nr, void *addr);
int test_and_clear_bit(nr, void *addr);
int test_and_change_bit(nr, void *addr);
上述test_and_***_bit(nr,void*addr)操作等同於執行test_bit(nr,void*addr)後再執行***_bit(nr,void*addr)。
Linux 裝置驅動中的併發控制
是指作業系統中,乙個時間段中有幾個程式都處於啟動執行到執行完畢間,且這幾個程式都是同乙個處理器上執行,但任何乙個時間點只有乙個程式在處理機器上執行。併發容易導致競爭問題。是兩個或者多個程序同時訪問乙個資源,從而引起的資源錯誤。所謂的原子操作就是該作業系統不會在執行完畢前被任何其他任務或者事件打斷。也...
Linux 裝置驅動併發控制簡述
答案 在linux中會遇到多個程序對共享資源的併發訪問,併發訪問會導致競態的發生,所以需要併發控制機制。併發與競態是指多個執行單位同時並行的被執行,而併發的執行單位對共享資源的訪問很容易導致競態 2.1 對稱多處理器 smp系統 的多個cpu 多個cpu共用同一條系統匯流排,因此可以訪問共同的外設和...
Linux 裝置驅動併發控制例項
在前面的筆記中,學習了linux裝置驅動中的併發控制,其中有中斷遮蔽 原子操作 自旋鎖 訊號量 互斥體及完成量。這幾種併發控制的技術就是解決多程序或多cpu之間對共享資源的同時訪問引起的競態問題。它們之間根據各自的性質使用在不同的場合中,這裡就不重複的介紹了,下面來分析 linux裝置驅動開發詳解 ...