併發競態的解決方法

2021-10-24 01:49:10 字數 2683 閱讀 3413

有多個程序同時訪問同乙個驅動程式中的臨界資源的時候,

競態就會產生了。

競態產生的根本原因

1.對於單核cpu,核心支援搶占。

2.多核cpu,核與核之間會產生競態

3.中斷和程序間也會產生競態

4.中斷和中斷間產生競態(中斷巢狀可以)(arm架構不支援)

一、中斷遮蔽(了解)

中斷遮蔽只適合在單核cpu。中斷遮蔽保護的臨界資源

要盡可能的短(時間),如果遮蔽的時間較長,可能導致

核心的崩潰,或者使用者資料的丟失。

local_irq_disable()

;//臨界資源

local_irq_enable()

;

二、自旋鎖(重點)(針對多核cpu設計的)

自旋鎖:在乙個程序獲取到這把鎖之後,另外乙個程序也想獲取

這把鎖,此時第二個程序就處於自旋狀態。

1.自旋鎖是會消耗cpu資源(輪詢進行訪問是否已經解鎖)

2.自旋鎖保護的臨界資源盡可能的短,在上鎖區間不能做

延時,耗時,copy_from_user/copy_to_user,不能夠讓

程序狀態切換。

3.自旋鎖會導致死鎖(在同乙個程序內想多次獲取同一把未解鎖的鎖)

4.自旋鎖在上鎖的時候會關閉搶占。

5.自旋鎖工作在中斷上下文。

api:

//定義自旋鎖

spinlock_t lock;

//初始化自旋鎖

spin_lock_init

(&lock)

;//上鎖

spin_lock

(&lock)

;spin_trylock

(spinlock_t *lock)

//解鎖

spin_unlock

(&lock)

;

三、訊號量(重點)

訊號量:當乙個程序獲取到鎖之後,另外乙個程序也想獲取這個

鎖,此時第二個程序處於休眠狀態。

1.休眠狀態的程序是不消耗cpu資源的

2.訊號量保護的臨界區,可以有延時,耗時,休眠,甚至程序

狀態切換的**。

3.訊號量工作在程序上下文,(不能再中斷上下文使用)

4.訊號量開銷比較大

api:

//定義訊號量

struct semaphore sem;

//初始化訊號量

void

sema_init

(struct semaphore *sem,

int val)

val:設定的是訊號量可以被獲取的次數,但是一般在

:驅動中都是設定為1,實現互斥的效果。

val:

0表示同步,在呼叫down的時候就休眠了,必須通過

up之後才能獲取訊號量。

//上鎖

down

(struct semaphore *sem)

;int

down_trylock

(struct semaphore *sem)

;成功返回0,失敗返回1

//解鎖

voidup(

struct semaphore *sem)

;

四、互斥體(會用)

1.定義互斥體

struct mutex lock;
2.初始化互斥體

mutex_init

(&lock)

;

3.上鎖

void

mutex_lock

(&lock)

;int

mutex_trylock

(struct mutex *lock)

成功返回1,失敗返回0

4.解鎖

void

mutex_unlock

(struct mutex *lock)

五、原子操作(會用)(將整個操作看成乙個整體,使用內聯彙編完成)

typedef

struct

atomic_t;

//定義及初始化

atomic_t lock =

atomic_init(1

);//上鎖

atomic_dec_and_test

(v);

//減去1之後和0比較,如果結果為0,表示獲取鎖成功了,

//否者失敗

//解鎖

atomic_inc

(v)//定義及初始化

atomic_t lock =

atomic_init(-

1);//上鎖

atomic_inc_and_test

(v)//加1之後和0比較,如果結果為0,表示獲取鎖成功了,

//否者失敗

//解鎖

atomic_dec

(v);

併發與競態

linux是乙個多工的作業系統,在多個程序同時執行時,就有可能為了競爭同乙個資源發生堵塞。以下是解決的幾種方法 1 訊號量 declare mutex sem if down interruptible sem critical section up sem 2 完成量 declare comple...

併發與競態及解決途徑

併發與競態及解決途徑 併發 concurrency 是指多個執行單元同時 並行的被執行,而併發執行單元對共享資源的訪問很容導致競態 race condition 併發與競態發生的條件 對稱多處理器 smp 的多個cpu 單cpu內程序與搶占它的程序 中斷與程序之間。解決併發與競態的途徑 訪問共享資源...

LDD 併發和競態

1.正在執行的多個使用者空間程序可能以一種令人驚訝的組合方式訪問我們的 2.smp系統甚至可在不同的處理器上同時執行我們的 3.核心是可搶占的,驅動程式 可能在任何時候丟失對處理器的獨佔 4.裝置中斷時非同步事件,可能導致 的併發執行 5.核心還提供了許多可延遲 執行的機制,比如workqueue ...