Linux 併發與競爭詳解

2021-10-06 06:15:02 字數 2492 閱讀 7809

多個任務、中斷都能訪問的資源叫共享資源,在驅動開發中注意對共享資源的保護,防止共享資源的併發訪問造成混亂。

1、什麼是併發?

【答】:併發就是多個 「使用者」 同時訪問同乙個共享資源,併發訪問帶來的問題就是競爭。

2、什麼是競爭?

【答】:linux 是多工作業系統,肯定存在多個任務共同操作同一段記憶體或裝置,這些任務可能會相互覆蓋這段記憶體中的資料,造成記憶體資料混亂。

3、造成 linux 系統併發產生的原因?

(1)多工(執行緒)併發訪問

(2)搶占式併發訪問

(3)中斷程式併發訪問

(4)smp(多核)核間併發訪問

4、保護的內容是什麼?

【答】:某個執行緒區域性變數不需要保護,要保護的是多個執行緒都會訪問的共享資料。如:全域性變數,裝置結構體成員。

對於共享資料進行原子操作(不可分割的操作),一般原子操作用於變數或者位操作。

對於基本的賦值操作,如:a = 3,arm 架構不支援直接對暫存器進行讀寫操作,它在 arm 中執行的步驟:

ldr r0,

=0x30000000

// 變數 a 位址

ldr r1,=3

// 要寫入的值

str r1,

[r0]

// 將 3 寫入到 a 變數中

即 c 語言中的變數賦值語句,在彙編中轉化成三行彙編指令,就有可能出現併發競爭問題,我們要保證三行彙編指令作為乙個整體執行,linux 核心提供了兩組原子操作 api 函式,一組對整形變數進行操作,一組對位進行操作。

1、原子整形操作 api 函式

linux 核心定義了叫做 atomic_t 的結構體來完成整形資料的原子操作,在使用中用原子變數來代替整形變數。

(1)使用原子操作 api 函式,首先要先定義乙個 atomic_t 的變數,如:atomic_t a,即原子變數。

(2)呼叫 linux 核心提供的大量原子操作 api 函式對原子變數進行操作。

2、原子位操作 api 函式

原子位操作不像原子整形變數那樣有個 atomic_t 的資料結構,原子位操作是直接對記憶體進行操作。

注意:原子操作是用於變數,不一定非要是全域性變數,也可以是結構體中的整形變數,它一般用於整形變數(int)和位操作,因為 linux 核心提供了原子整形操作 api 函式和位操作 api 函式。

原子操作只能對整形變數或者位進行保護,使用自旋鎖保護結構體變數,適用於短時期輕量級加鎖,長時間就用訊號量。

1、為什麼稱為 「自旋鎖」?

(1)自旋:如果自旋鎖正在被執行緒 a 持有,執行緒 b 想要獲取自旋鎖,那麼執行緒 b 就會一直在原地等待,即等待自旋鎖的執行緒會一直處於自旋狀態,這樣會浪費處理器時間,降低系統效能。

(2)鎖:當乙個執行緒要訪問某個共享資源的時候首先要先加鎖, 鎖只能被乙個執行緒持有,只要此執行緒不釋放持有的鎖,那麼其他的執行緒就不能獲取此鎖。

2、自旋鎖 api 函式

linux 核心使用結構體 spinlock_t 表示自旋鎖,使用用自旋鎖之前,首先要定義乙個自旋鎖變數,如:spinlock_t a。

3、自旋鎖使用注意事項

(1)等待自旋鎖時處於 「自旋」 狀態,因此鎖的持有時間不能太長,一定要短,否則的話會降低系統效能。

(2)被自旋鎖保護的臨界區一定不能呼叫任何能夠引起睡眠和阻塞的 api 函式,否則可能會導致死鎖現象的發生。

訊號量可以使執行緒進入休眠狀態,會切換執行緒,訊號量的開銷要比自旋鎖大,適用於占用資源比較久的場合。

1、訊號量型別

2、訊號量 api 函式

linux 核心使用 semaphore 結構體表示訊號量,使用訊號量之前,首先要定義訊號量變數,如:struct semaphore a。

3、訊號量使用注意事項

(1)訊號量不能用於中斷中,因為訊號量會引起休眠,中斷不能休眠。

(2)如果共享資源的持有時間較短,不適合使用訊號量,因為頻繁的休眠、切換執行緒造成很大開銷。

訊號量值 = 1 可以實現互斥訪問,linux 比訊號量更專業的機制來進行互斥,即互斥體 mutex。使用過程中有其它執行緒想要獲取該資源的鎖,那麼它就會被阻塞陷入睡眠狀態,直到該資源被解鎖才會被喚醒。

1、互斥體 api 函式

linux 核心使用 mutex 結構體表示互斥體,使用互斥體之前,首先要定義互斥體變數,如:struct mutex a。

2、互斥體使用注意事項

(1)mutex 可以導致休眠,因此不能在中斷中使用 mutex,中斷中只能使用自旋鎖。

(2)和二值訊號量一樣, mutex 保護的臨界區可以呼叫引起阻塞的 api 函式,阻塞函式進入休眠狀態,直到資源解鎖被喚醒。

linux的併發與競爭

自旋鎖訊號量 互斥體併發就是多個 使用者 同時訪問乙個資源 所以解決的方法就是讓這乙個資源每個時刻只能有乙個使用者訪問,hhh linux系統併發產生的原因,主要有以下幾種 上面指的資源就是臨界區臨界區就是共享資料段,對於臨界區必須保證一次只有乙個執行緒訪問 原子操作就是不能再進一步分割的操作,一般...

併發之競爭狀態

如果兩個或者多個 goroutine 在沒有互相同步的情況下,訪問某個共享的資源,並試圖同時讀和寫這個資源,就處於相互競爭的狀態。這種情況被稱作競爭狀態。要想解決競爭狀態,對乙個共享資源的讀和寫操作必須是原子化的。也就是說,同一時刻只能有乙個 goroutine 對共享資源進行讀和寫操作。可見 為 ...

web滲透 40 競爭 併發漏洞

競爭 併發漏洞,常屬於邏輯業務中的漏洞型別,例如攻擊者通過併發http tcp請求而達到多次獲獎 多次收穫 多次獲贈等非正常邏輯所能觸發的效果。下面以簡化的例子說明在交易的web應用程式中潛在的並行問題,並涉及聯合儲蓄帳戶中的兩個使用者 執行緒 都登入到同一帳戶試圖轉賬的情況 1.帳戶a有100存款...