linux核心鎖機制

2021-09-22 18:07:50 字數 2286 閱讀 4757

#核心鎖的討論:

##為什麼需要核心鎖?

多核處理器下,會存在多個程序處於核心態的情況,而在核心態下,程序是可以訪問所有核心資料的,因此要對共享資料進行保護,即互斥處理

##有哪些核心鎖機制?

###(1)原子操作

atomic_t資料型別,atomic_inc(atomic_t *v)將v加1

原子操作比普通操作效率要低,因此必要時才使用,且不能與普通操作混合使用

如果是單核處理器,則原子操作與普通操作相同

###(2)自旋鎖

spinlock_t資料型別,spin_lock(&lock)和spin_unlock(&lock)是加鎖和解鎖

等待解鎖的程序將反覆檢查鎖是否釋放,而不會進入睡眠狀態(忙等待),所以常用於短期保護某段**

同時,持有自旋鎖的程序也不允許睡眠,不然會造成死鎖——因為睡眠可能造成持有鎖的程序被重新排程,而再次申請自己已持有的鎖

如果是單核處理器,則自旋鎖定義為空操作,因為簡單的關閉中斷即可實現互斥

###(3)訊號量與互斥量

struct semaphore資料型別,down(struct semaphore * sem)和up(struct semaphore * sem)是占用和釋放

struct mutex資料型別,mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加鎖和解鎖

競爭訊號量與互斥量時需要進行程序睡眠和喚醒,代價較高,所以不適於短期**保護,適用於保護較長的臨界區互斥量與訊號量的區別?

互斥量用於執行緒的互斥,訊號線用於執行緒的同步

這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別

互斥:是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源

互斥量值只能為0/1,訊號量值可以為非負整數

也就是說,乙個互斥量只能用於乙個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量是,也可以完成乙個資源的互斥訪問

互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由乙個執行緒釋放,另乙個執行緒得到

#mutex和spin lock的區別和應用(sleep-waiting和busy-waiting的區別)

訊號量mutex是sleep-waiting。 就是說當沒有獲得mutex時,會有上下文切換,將自己、加到忙等待佇列中,直到另外乙個執行緒釋放mutex並喚醒它,而這時cpu是空閒的,可以排程別的任務處理。

而自旋鎖spin lock是busy-waiting。就是說當沒有可用的鎖時,就一直忙等待並不停的進行鎖請求,直到得到這個鎖為止。這個過程中cpu始終處於忙狀態,不能做別的任務。

例如在乙個雙核的機器上有兩個執行緒(執行緒a和執行緒b),它們分別執行在core0 和core1上。 用spin-lock,coer0上的執行緒就會始終占用cpu。

另外乙個值得注意的細節是spin lock耗費了更多的user time。這就是因為兩個執行緒分別執行在兩個核上,大部分時間只有乙個執行緒能拿到鎖,所以另乙個執行緒就一直在它執行的core上進行忙等待,cpu佔用率一直是100%;而mutex則不同,當對鎖的請求失敗後上下文切換就會發生,這樣就能空出乙個核來進行別的運算任務了。(其實這種上下文切換對已經拿著鎖的那個執行緒效能也是有影響的,因為當該執行緒釋放該鎖時它需要通知作業系統去喚醒那些被阻塞的執行緒,這也是額外的開銷)

##總結

mutex適合對鎖操作非常頻繁的場景,並且具有更好的適應性。儘管相比spin lock它會花費更多的開銷(主要是上下文切換),但是它能適合實際開發中複雜的應用場景,在保證一定效能的前提下提供更大的靈活度。

spin lock的lock/unlock效能更好(花費更少的cpu指令),但是它只適應用於臨界區執行時間很短的場景。而在實際軟體開發中,除非程式設計師對自己的程式的鎖操作行為非常的了解,否則使用spin lock不是乙個好主意(通常乙個多執行緒程式中對鎖的操作有數以萬次,如果失敗的鎖操作(contended lock requests)過多的話就會浪費很多的時間進行空等待)。

更保險的方法或許是先(保守的)使用 mutex,然後如果對效能還有進一步的需求,可以嘗試使用spin lock進行調優。畢竟我們的程式不像linux kernel那樣對效能需求那麼高(linux kernel最常用的鎖操作是spin lock和rw lock)。

linux 核心鎖機制簡單介紹

在作業系統引入了程序概念,程序成為排程實體後,系統就具備了併發執行多個程序的能力,但也導致了系統中各個程序之間的 資源競爭和共享。另外,由於中斷 異常機制的引入,以及核心態搶占都導致了這些核心執行路徑 程序 以交錯的方式執行。對於這些交錯路徑執行的核心路徑,如不採取必要的同步措施,將會對一些關鍵資料...

linux核心同步機制之自旋鎖

定義 最多只能被乙個可執行執行緒持有。如果乙個執行執行緒試圖獲得乙個被爭用的自旋鎖,那麼該執行緒就會一直進行忙迴圈 旋轉 等待鎖重新可用。自旋鎖有 加鎖 和 解鎖 兩種狀態。加鎖 一直在尋求 解鎖 解鎖 馬上會尋求 加鎖 並原地打轉,所以加鎖位置的 進入臨界區執行,直到解鎖。注意 1.占用臨界區的時...

Linux 核心自旋鎖

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