2

斯科特對編程語言語用學的自旋鎖存在一些困難。感謝您能否更清楚地解釋它們。謝謝。如何理解螺旋鎖的這些實現?

  1. 儘管所有這些算法是歷史上重要的,一個實用 自旋鎖需要在恆定時間和空間中運行,而這一個 需要的原子指令,做比加載或存儲更多。 從20世紀60年代開始,硬件設計人員開始爲他們的 處理器配備指令,讀取,修改和寫入位置爲單個原子操作。最簡單的這樣的指令 被稱爲test_and_set。它將布爾變量設置爲true,並且返回變量是否先前爲假的指示。 鑑於test_and_set中,獲得一個自旋鎖幾乎是微不足道的:

    while not test_and_set(L) 
        –– nothing –– spin 
    

    什麼的L的價值是什麼意思?

    是否test_and_set(L)返回false當且僅當L爲真?

    它爲什麼作爲自旋鎖工作?

  2. 在實踐中,在一個循環中嵌入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 LL指令 ?

    這種方式如何比第一個更好?

回答

3

L的意思是什麼?

L在鎖定空閒時設置爲0,鎖定被某人鎖定時設置爲1。

當且僅當L爲真時,test_and_set(L)是否返回false?

是的,它在您引用的引用中有明確的描述:「返回變量之前是否爲false」的指示。

它爲什麼作爲自旋鎖?

它滿足上述變量L的不變量。

「普通讀取(加載)指令」是指L讀取L的指令嗎?

是的。

這種方式如何比第一個更好?

檢查L是0通過「通常的讀」指令涉及小於通過使用test_and_set指令「量的多核或多處理器機器上的通信」。所以,當一個內核在鎖上旋轉時,其他內核受影響較小。