2012-03-26 178 views
6

你可以在這個鏈接看到一個有趣的表。 http://norvig.com/21-days.html#answers'互斥鎖'究竟做了什麼?

表所描述的,
互斥鎖定/解鎖25 nanosec
從主存儲器100 nanosec

納秒取?
我很驚訝,因爲mutex lockfetch data from memory更快。如果是這樣,mutex lock究竟是做什麼的? Mutex lock是什麼意思?

+0

我不明白你的意外。互斥鎖在數據「更改」(寫入)上執行,而提取意味着「讀取」。當沒有人獲得互斥鎖時,它不會執行任何操作(發生在「讀取」操作完成時)。我想念什麼? – alfasin 2012-03-26 01:40:56

回答

1

您鏈接的文章沒有提及架構,但通過提及L1和L2緩存來判斷它是英特爾。如果是這樣,那麼我認爲通過互斥鎖它們意味着LOCK指令。在這方面,這個帖子似乎相關:Intel 64 and IA-32 | Atomic operations including acquire/release semantic

Intel software developer's manual可以幫助,如果你知道,你在找什麼。我會閱讀任何有關LOCK指令的相關信息。

+0

嗯,它只是意味着LOCK指令?然後,這是有道理的(25納秒)。雖然,我想知道他爲什麼使用'Mutex鎖'這個術語。 '互斥鎖'是由'LOCK'指令實現的嗎? – Benjamin 2012-03-26 02:00:03

+0

我認爲互斥是一個簡潔的詞語'相互排斥'。所以,LOCK指令可以被認爲是Mutex。 – 2013-02-08 02:37:25

12

假設有十個人必須共用一支筆(也許他們在一家非常資金匱乏的公司工作)。由於他們必須用鋼筆書寫長文件,但大部分寫文件的工作只是想着說什麼,他們同意每個人都可以用鋼筆書寫文件的一個句子,然後必須使其可供小組的其他成員使用。

現在我們遇到了一個問題:如果兩個人都在考慮下一句話,並且都想立即使用筆呢?我們可以說這兩個人都可以拿起筆,但這是一支脆弱的舊筆,所以如果兩個人抓住它,那麼它就會破裂。相反,我們在筆周圍繪製粉筆線。首先你把手伸過粉筆線,然後你拿筆。如果一個人的手在粉筆線內,則不允許其他人將手放在粉筆線內。如果兩個人試圖同時將手放在粉筆線上,根據這些規則,只有其中一個人會先進入粉筆線,所以另一個人必須拉回他們的手並將其保持在粉筆線之外直到筆再次可用。

讓我們把它和互斥體聯繫起來。互斥體是一種短時間內保護共享資源(筆)的方法,稱爲關鍵部分(寫入文檔的一個句子的時間)。無論何時您想使用該資源,您都同意先致電mutex_lock(將您的手放在粉筆線內)。無論何時您使用該資源,您同意致電mutex_unlock(從粉筆線區域伸出手)。

現在來看如何實現互斥鎖。互斥體通常使用共享內存來實現。有一些共享的不透明數據對象被稱爲互斥鎖,並且mutex_lockmutex_unlock函數都帶有指向其中之一的指針。 mutex_lock函數使用原子測試和設置或加載鏈接/存儲條件指令序列(在x86上經常使用xhcg)檢查和修改互斥量內的數據,並且「獲取互斥量」 - 設置互斥鎖的內容該互斥對象向其他線程指示關鍵部分被鎖定 - 或者必須等待。最終,線程獲取互斥鎖,完成關鍵部分內的工作,並調用mutex_unlock。此函數設置互斥量內的數據以將其標記爲可用,並且可能喚醒已嘗試獲取互斥體的睡眠線程(這取決於互斥體實現 - 一些mutex_lock的實現僅在xchg上旋轉,直到互斥體是可用的,所以不需要mutex_unlock來通知任何人)。

爲什麼鎖定互斥鎖比外出到內存要快?總之,緩存。 CPU有一個可以非常快速地訪問的緩存,所以只要處理器可以確保沒有其他處理器訪問該數據,那麼操作不需要一路走出內存。但x86擁有「擁有」高速緩存行的概念 - 如果處理器0擁有高速緩存行,則任何想要使用該高速緩存行中數據的其他處理器都必須通過處理器0.這樣,不需要xhcg操作來查看高速緩存之外的任何數據,並且高速緩存訪​​問速度非常快,因此獲取無爭議的互斥量比存儲器訪問速度更快。

但是最後一段有一個警告:速度優勢只適用於無爭議的互斥鎖。如果兩個線程試圖同時鎖定相同的互斥鎖,那麼運行這些線程的處理器必須進行通信並處理相關緩存行的所有權,這會極大地降低互斥鎖的獲取速度。另外,兩個線程中的一個將不得不等待另一個線程執行關鍵部分的代碼,然後釋放該互斥鎖,從而進一步減慢其中一個線程的互斥鎖獲取。

+1

真的很好的例子。 (Y) – Tirth 2014-09-24 08:57:28