mutex 和spin lock的區別

2021-07-10 08:34:30 字數 2160 閱讀 9891

在這裡推薦一本書《深入linux核心機制分析》,這本書對這些講得非常好,對有基礎的朋友幫助會很大,新手建議不好要使用,因為有一種雲裡霧裡的感覺,非常的枯燥。

有哪些核心鎖機制?

(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)是加鎖和解鎖

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

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

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

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

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

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

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

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

訊號量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則不同,當對鎖的請求失敗後上下文切換就會發生,這樣就能空出乙個核來進行別的運算任務了。(其實這種上下文切換對已經拿著鎖的那個執行緒效能也是有影響的,因為當該執行緒釋放該鎖時它需要通知作業系統去喚醒那些被阻塞的執行緒,這也是額外的開銷)

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

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

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

mutex和spin lock的區別

mutex和spin lock的區別和應用 sleep waiting和busy waiting的區別 2011 10 19 11 43 訊號量mutex是sleep waiting。就是說當沒有獲得mutex時,會有上下文切換,將自己 加到忙等待佇列中,直到另外乙個執行緒釋放mutex並喚醒它,而...

spinlock的設計和實現

在linux的核心中,spin lock用在多處理器環境中。當乙個cpu訪問乙個臨界資源 critical section 的時候,需要預先取得spin lock,如果取不到的話,它就在空迴圈 等待,直到另外的cpu釋放spin lock。由於涉及到多個處理器,spin lock的效率非常重要。因為...

Mutex 和 monitor的區別

monitor和lock多用於鎖定被呼叫端,而mutex則多用鎖定呼叫端。lock this 或者是用monitor也是一樣的,如下 monitor.enter this do something monitor.exit this monitor的好處是可以用tryenter this,timeo...