是指作業系統中,乙個時間段中有幾個程式都處於啟動執行到執行完畢間,且這幾個程式都是同乙個處理器上執行,但任何乙個時間點只有乙個程式在處理機器上執行。併發容易導致競爭問題。
是兩個或者多個程序同時訪問乙個資源,從而引起的資源錯誤。
所謂的原子操作就是該作業系統不會在執行完畢前被任何其他任務或者事件打斷。也就是說,原子操作是一種不可以被打斷的操作。原子操作需要硬體的支援,因此是架構相關的,其api和原子型別的定義都定義在核心原始碼的include/asm/atomic.**件中。
原子要麼執行,要麼不執行。優點是簡單,缺點是只能做技術操作。
typedef struct
atomic_t;
關鍵字volatile用來暗示gcc不要對該型別做資料優化,所以對這個變數counter的訪問都是基於記憶體的,不要將其緩衝到暫存器中。
自旋鎖是一種建安的併發控制機制,其是實現訊號量和完成量的基礎。自旋鎖對資源有很好的保護作用,在linux驅動程式中程序使用,避免競爭條件。
linux有兩種鎖,乙個是自旋鎖,乙個是訊號量。這兩種鎖是為了解決核心中遇到的不同問題開發的。
注意:1. 自旋鎖是一種忙等待,對系統效能有影響,是一種輕量級的枷鎖機制。
2. 自旋鎖不能遞迴使用,這是因為,自選鎖被設計成在不同現成或者函式之間的同步。如果乙個執行緒在已經持有自旋鎖時,其處於忙等待狀態,則已經沒有機會釋放自己所持有的鎖了。如果這時再呼叫自身,則自旋鎖永遠沒有機會執行了。
struct spinlock_t
spinlock_t lock = spin_lock_unlocked;
void spin_lock_init(spinlock_t lock);
void function()
例子:
int count=0;
spinlock_t lock;
int ***x_init(void)
int ***_open(struct inode* inode, struct file* filp)
count ++;
spin_unlock(&lock);
//***
}int ***_release(strut inode* inode, struct file* filp)
linux提供了兩種訊號量,一種用於核心程式中個,一種用於應用程式中。
訊號量只有當得到訊號量的程序或者執行緒才能進入臨界區,執行臨界**。訊號量與自旋鎖的最大的不同在於,當乙個程序試圖獲取乙個已經鎖定的訊號量時,程序不會像自旋鎖一樣處於忙等待。
從訊號量的原理上來說,沒有獲得訊號量的函式可能睡眠。這就要求只有能夠睡眠的程序才能使用訊號量,不能睡眠的程序不能使用訊號量。
struct seamphore
;
count = 0:表示訊號量被其他程序使用,現在不可以用這個訊號量,但是wait_list佇列中沒有程序在等待訊號量
count <0:表示至少有乙個程序在wait_list佇列中等待訊號量被釋放;
count>0:表示這個訊號量是空閒的,程式可以使用這個訊號量;
Linux 裝置驅動併發控制簡述
答案 在linux中會遇到多個程序對共享資源的併發訪問,併發訪問會導致競態的發生,所以需要併發控制機制。併發與競態是指多個執行單位同時並行的被執行,而併發的執行單位對共享資源的訪問很容易導致競態 2.1 對稱多處理器 smp系統 的多個cpu 多個cpu共用同一條系統匯流排,因此可以訪問共同的外設和...
Linux 裝置驅動併發控制例項
在前面的筆記中,學習了linux裝置驅動中的併發控制,其中有中斷遮蔽 原子操作 自旋鎖 訊號量 互斥體及完成量。這幾種併發控制的技術就是解決多程序或多cpu之間對共享資源的同時訪問引起的競態問題。它們之間根據各自的性質使用在不同的場合中,這裡就不重複的介紹了,下面來分析 linux裝置驅動開發詳解 ...
裝置驅動中的併發控制 (2)
訊號量也是一種保護臨界資源的一種方法。訊號量與自旋鎖的使用方法基本一樣。與與自旋鎖不同的是,當獲取不到訊號量時,程序不會原地打轉而是進入休眠等待狀態。在linux中,訊號量的定義如下 struct semaphore成員變數 1.lock自旋鎖 對count變數起保護作用 2.count變數 是訊號...