斯科特對編程語言語用學的自旋鎖存在一些困難。感謝您能否更清楚地解釋它們。謝謝。如何理解螺旋鎖的這些實現?
-
儘管所有這些算法是歷史上重要的,一個實用 自旋鎖需要在恆定時間和空間中運行,而這一個 需要的原子指令,做比加載或存儲更多。 從20世紀60年代開始,硬件設計人員開始爲他們的 處理器配備指令,讀取,修改和寫入位置爲單個原子操作。最簡單的這樣的指令 被稱爲
test_and_set
。它將布爾變量設置爲true,並且返回變量是否先前爲假的指示。 鑑於test_and_set中,獲得一個自旋鎖幾乎是微不足道的:while not test_and_set(L) –– nothing –– spin
什麼的
L
的價值是什麼意思?是否
test_and_set(L)
返回false當且僅當L
爲真?它爲什麼作爲自旋鎖工作?
-
在實踐中,在一個循環中嵌入test_and_set趨向於導致在多核或多處理器 機 不可接受量的通信,作爲高速緩存一致性機制試圖調和由多個內核試圖獲取寫入 鎖。這種硬件資源的過度需求被稱爲競爭,並且是大型機器上的良好性能的主要障礙。
爲了降低爭用,同步庫的作者經常 採用測試和test_and_set鎖,這與普通的自旋讀 (SATIS音響由高速緩存編),直到它出現該鎖是免費的(見 圖13.8)。當一個線程釋放一個鎖時,當等待線程執行它們的test_and_sets時,總線或互連活動依然傾向於總線或互連活動,但至少這種活動只發生在臨界區的 邊界上。在大型機器上,通過實施退避策略可以進一步減少爭用,其中嘗試獲取鎖定的線程 在嘗試再次嘗試之前等待 一段時間,然後等待 。
type lock = Boolean := false; procedure acquire lock(ref L : lock) while not test and set(L) while L –– nothing –– spin procedure release lock(ref L : lock) L := false
圖13.8簡單的test-and-test_and_set鎖。等待進程 以普通讀取(加載)指令旋轉,直到看起來鎖定爲 爲空,然後使用test_and_set獲取它。第一次訪問是 test_and_set,用於在普通(無競爭)情況下的速度。
是否「通常的讀出(負載)的說明」指的閱讀
while L
L
指令 ?這種方式如何比第一個更好?