Linux的幾種核心鎖及其作用

2021-08-07 18:39:53 字數 1592 閱讀 4529

mutex(互斥鎖):

互斥鎖主要用於實現核心中的互斥訪問功能。對它的訪問必須遵循一些規則:同一時間只能有乙個任務持有互斥鎖,而且只有這個任務可以對互斥鎖進行解鎖。互斥鎖不能進行遞迴鎖定或解鎖。

semaphore (訊號量):

訊號量在建立時需要設定乙個初始值,表示同時可以有幾個任務可以訪問該訊號量保護的共享資源,初始值為1就變成互斥鎖(mutex),即同時只能有乙個任務可以訪問訊號量保護的共享資源。乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1,若當前訊號量的值為負數,表明無法獲得訊號量,該任務必須掛起在該訊號量的等待佇列等待該訊號量可用;若當前訊號量的值為非負數,表示可以獲得訊號量,因而可以立刻訪問被該訊號量保護的共享資源。當任務訪問完被訊號量保護的共享資源後,必須釋放訊號量,釋放訊號量通過把訊號量的值加1實現,如果訊號量的值為非正數,表明有任務等待當前訊號量,因此它也喚醒所有等待該訊號量的任務。

rw_semaphore (讀寫訊號量):

讀寫訊號量對訪問者進行了細分,或者為讀者,或者為寫者,讀者在保持讀寫訊號量期間只能對該讀寫訊號量保護的共享資源進行讀訪問,如果乙個任務除了需要讀,可能還需要寫,那麼它必須被歸類為寫者,它在對共享資源訪問之前必須先獲得寫者身份,寫者在發現自己不需要寫訪問的情況下可以降級為讀者。讀寫訊號量同時擁有的讀者數不受限制,也就說可以有任意多個讀者同時擁有乙個讀寫訊號量。如果乙個讀寫訊號量當前沒有被寫者擁有並且也沒有寫者等待讀者釋放訊號量,那麼任何讀者都可以成功獲得該讀寫訊號量;否則,讀者必須被掛起直到寫者釋放該訊號量。如果乙個讀寫訊號量當前沒有被讀者或寫者擁有並且也沒有寫者等待該訊號量,那麼乙個寫者可以成功獲得該讀寫訊號量,否則寫者將被掛起,直到沒有任何訪問者。因此,寫者是排他性的,獨占性的。

spanlock(自旋鎖):

自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,」自旋」一詞就是因此而得名。由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋而不是睡眠是非常必要的,自旋鎖的效率遠高於互斥鎖。

訊號量和讀寫訊號量適合於保持時間較長的情況,它們會導致呼叫者睡眠,因此只能在程序上下文使用(_trylock的變種能夠在中斷上下文使用),而自旋鎖適合於保持時間非常短的情況,它可以在任何上下文使用。如果被保護的共享資源只在程序上下文訪問,使用訊號量保護該共享資源非常合適,如果對共巷資源的訪問時間非常短,自旋鎖也可以。但是如果被保護的共享資源需要在中斷上下文訪問(包括底半部即中斷處理控制代碼和頂半部即軟中斷),就必須使用自旋鎖。

自旋鎖保持期間是搶占失效的,而訊號量和讀寫訊號量保持期間是可以被搶占的。自旋鎖只有在核心可搶占或smp的情況下才真正需要,在單cpu且不可搶占的核心下,自旋鎖的所有操作都是空操作。

跟互斥鎖一樣,乙個執行單元要想訪問被自旋鎖保護的共享資源,必須先得到鎖,在訪問完共享資源後,必須釋放鎖。如果在獲取自旋鎖時,沒有任何執行單元保持該鎖,那麼將立即得到鎖;如果在獲取自旋鎖時鎖已經有保持者,那麼獲取鎖操作將自旋在那裡,直到該自旋鎖的保持者釋放了鎖。

無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。

Linux 核心自旋鎖

現在很多cpu都是幾核幾核的了,如果有乙個變數a,cpu x正在訪問,突然cpu y也過來訪問他,這時候就可能出現問題,因為這個a非常重要,可能導致系統崩潰,中斷異常等。我們來看之前說的tp驅動裡面的 void gtp irq enable struct goodix ts data ts spin...

linux核心鎖機制

核心鎖的討論 為什麼需要核心鎖?多核處理器下,會存在多個程序處於核心態的情況,而在核心態下,程序是可以訪問所有核心資料的,因此要對共享資料進行保護,即互斥處理 有哪些核心鎖機制?1 原子操作 atomic t資料型別,atomic inc atomic t v 將v加1 原子操作比普通操作效率要低,...

Linux 中主要有哪幾種核心鎖

linux 中主要有哪幾種核心鎖?linux 的同步機制從 2.0 到 2.6 以來不斷發展完善。從最初的原子操作,到後來的訊號量,從大核心鎖到今天的自旋鎖。這些同步機制的發展伴隨 linux 從單處理器到對稱多處理器的過渡 伴隨著從非搶占核心到搶占核心的過度。linux 的鎖機制越來越有效,也越來...