linux驅動之 訊號量 自旋鎖 互斥體

2021-07-02 21:52:46 字數 2145 閱讀 2265

0 原子操作

原子操作就是單位操作,也就是說操作過程不能被中斷

下面**中每條語句看起來是原子操作,其實不是原子操作;

int main(0

這兩條c語句度不是原子操作,某條彙編語句可能會被其他程序或者執行緒打斷

使對整形資料(int)操作變成原子操作,要依靠乙個資料型別:atomic_t

atomic_t  n; //定義乙個原子變數

atomic_set(&n,2);//將變數初始值設為2

atmoic_add(5,&n);//將變數加5

atomic_dec(&n);//將變數減1

ptink(「n%d\n」,atomic_read(&n));//輸出n的值

實現原子操作方法;

1  自旋鎖  

自旋鎖它是為為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似

,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。

使用;定義:

spinlock_t lock;//定義

spin_lock_init(&lock);//初始化

spin_lock(&lock);//獲取,沒獲取就被阻塞 spin_trylock(&lock)不阻塞  立即返回 成功返回非0  不成功返回0

.......

.......

臨界區**

.........

spin_unlock(&lock);//釋放

2  訊號量 

訊號量又稱為訊號燈,它是用來協調不同程序間的資料物件的,而最主要的應用是共享記憶體方式的程序間通訊。本質上,訊號量是乙個計數器,它用來記錄對某個資源(如共享記憶體)的訪問狀況。一般說來,為了獲得共享資源,程序需要執行下列操作: 

(1) 測試控制該資源的訊號量。 

(2) 若此訊號量的值為正,則允許進行使用該資源。程序將訊號量減1。 

(3) 若此訊號量為0,則該資源目前不可用,程序進入睡眠狀態,直至訊號量值大於0,程序被喚醒,轉入步驟(1)。 

(4) 當程序不再使用乙個訊號量控制的資源時,訊號量值加1。如果此時有程序正在睡眠等待此訊號量,則喚醒此程序。

使用:struct semaphore sem;//定義

static  inline void sema_init(struct semaphore *sem,int val);//初始化

void down (struct semaphore *sem) ;//

獲取訊號量,

沒獲取到就使當前程序睡眠

另外乙個 downtrylock(struct semaphore *sem);  不睡眠  立即返回

.......

.......

臨界區**

.........

extern void up (struct semaphore *sem);//

釋放訊號量

3 互斥體

互斥體實現了「互相排斥」(mutual exclusion)同步的簡單形式(所以名為互斥體

(mutex))。互斥體禁止多個執行緒同時進入受保護的**「臨界區」(critical section)。因此,在任意時刻,只有乙個執行緒被允許進入這樣的**保護區。任何執行緒在進入臨界區之前,必須獲取(acquire)與此區域相關聯的互斥體的所有權。如果已有另一線程擁有了臨界區的互斥體,其他執行緒就不能再進入其中。這些執行緒必須等待,直到當前的屬主線程釋放(release)該互斥體。

使用;struct  mutex my_mutex;//

定義mutex_init(&my_mutex);//

初始化mutex_lock(struct mutex *lock) ;//另

獲取外乙個 mutex_trylock(struct mutex *lock)(沒獲取到也補睡眠,立即返回)

.......

.......

臨界區**

.........

void mutex_unlock(struct mutex *lock);//釋放

自旋鎖和訊號量

核心同步措施 用於linux核心 為了避免併發,防止競爭。核心提供了一組同步方法來提供對共享資料的保護。我們的重點不是介紹這些方法的詳細用法,而是強調為什麼使用這些方法和它們之間的差別。linux使用的同步機制可以說從2.0到2.6以來不斷發展完善。從最初的原子操作,到後來的訊號量,從大核心鎖到今天...

自旋鎖和訊號量

今天在閱讀核心 時遇到了自旋鎖函式,於是查閱資料,學習了一下自旋鎖和訊號量的知識。自旋鎖 自旋鎖是專為防止多處理器併發而引入的一種鎖,它應用於中斷處理等部分。對於單處理器來說,防止中斷處理中的併發可簡單採用關閉中斷的方式,不需要自旋鎖。自旋鎖最多只能被乙個核心任務持有,如果乙個核心任務試圖請求乙個已...

自旋鎖,互斥鎖,訊號量

自旋鎖,互斥鎖,訊號量 樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制 如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖 sleep ...