基本理念是要在原有 mutual exclusion algorithm 外加一些 variables 與指令,讓多數 在 trying region 開始競爭的 processes 受到阻擋之後,就進入 local spin 狀態暫停活動,
競爭者需要在 trying region 的迴圈(program loops)來回好幾次,陸陸續續可能又有競 爭者暫停活動,可是絕對要讓一個 process 順利通過 trying region 所有 loops 而進 CS。
當它到 exit region 時就以n−1次 remote writes 叫醒所有暫停活動者,系統又恢復到 algorithm 本來應有情況。然後又再次不停地重覆上述競爭過程。整個執行細節,如果不 看外加的這些 variables 與指令,則仍然符合原有 algorithm 之運作法則,上述暫停活動 可視為暫時因 context switching 而沒動作,如此而己。其功效卻可避免許多 processes 以 remote memory access 方式在 trying region 做無謂的嘗試。這理念可再詳述如下。
在 trying region 中的 contention protocol 讓 processes 決定何者可以成為 winner 而進 入 CS,該 protocol 的設計會使 mutual exclusion algorithm 兼具 progress property 與 safety property,觀察 Dijkstra’s[4]、Knuth’s[6]、Eisenburg-McGuire’s[5]、Lamport’s bakery[8]
和 Burns’[2]等 mutual exclusion algorithms,可在這些 contention protocols 的 program code 找到 progress property related loop(P-loop for short)和 safety property related loop(S-loop for short),這兩種 loop 缺一不可,互相呼應,其結構型態頗多,有巢狀的型態、有完 全分離的型態、也有合而為一的型態,通常某個 process 若能通過 S-loop 的阻擋就代表 已經成為最後結果之 winner 而可以進入 CS,而 P-loop 功能為促使系統免於陷入死結
(deadlock),其主要目的是要阻擋一些 process 且要讓少數比較優勢之 process 通過,
process 在 trying region 執行路徑中,可能要經過幾次 P-loop、S-loop、P-loop、S-loop、
P-loop … 交替阻擋,若系統處於 heavy loading 狀態下,大量 processes 開始執行 trying region,此 P-loop 往往是絕大多數 process 被阻擋之處,同時也是引發 memory contention 最嚴重的;有趣的是,此 P-loop 即是加上 local spin 絕佳之處,主因在於 P-loop 阻擋 process 之功能包含積極面與消極面,分述如下。
在大量 processes 執行 trying region 時,P-loop 阻擋多數 process,僅讓少數 process 繼續往前(此為阻擋功能的積極面)。透過 shared variables 每個 process 依著 algorithm 法則測知自己是可以脫離 P-loop,或者必須停留在 P-loop;一般狀況之下,僅有少數競 爭者可以脫離 loop(測知為暫時 winner),其他大部分競爭者必須停留於 P-loop 中(測 知為暫時 loser)。本文所提之 approach 要讓 process i 在 P-loop 測知自己目前己經不可 能順利通過 P-loop,則馬上 spin on 自己的 local shared variable permitted(i),靜待其它 某 process 進入 CS 在 exit region 用 remote memory write to 這個 variable 叫醒自己。如此,
僅有上述少數 processes 會繼續往前,自然就降低系統 remote memory access 次數。設計 得好的 P-loop 會讓繼續往前的 processes 個數,經過幾次 P-loop、 S-loop、 P-loop … 交 替篩選後很快就降低到剩下一個。這單一的 process 再往前作 S-loop 的測試時因為沒有
其他 process 干擾,可以順利的脫離而進 CS。因此,local spin 設置在 P-loop,可以大幅 降低系統 remote memory access 次數。
trying region
critical region (CS) remainder region
exit region
release all local-spinning processes contention protocol
progress property related loop
safety property related loop
loser path loser path
winner path
local spinning
Figure 3: The generic approach
另一方面,P-loop 雖會阻擋多數 process,但絕不阻斷所有 process 往前(此為阻擋 功能的消極面)。這消極面有助於此 generic approach 所得之 algorithms 可免陷入 local spin 機制所引發的 deadlock。設計 local spin algorithms 過程中,如果 local spin 的位置與方式 不當,很可能讓系統陷入 deadlock,例如某段時間內k個競爭者(k ≤n)在 trying region 執行當中都測知自己暫為 loser,因而全部進入 local spin 等待狀態,則此時這k個 processes 都在等待其它 processes 來叫醒自己,此即為 deadlock,必須預先設防。這問題 對於初學者並不容易,若依本文之 approach 將 local spin 設在 P-loop 之 loser path(如
Figure 3 右上角小圓形所示)上的適當位置,即能避免這種 deadlock。如何選定 local spin 適當位置,仍需要對個別 algorithm 的 progress property 內容有某種程度的瞭解,詳述如 下。
原始 algorithm 擁有 mutual exclusion problem 定義下的 safety property 與 progress property。我們的 generic approach 以不更改原始 algorithm 的基本 program structure 為首 要原則,利用額外的 local shared variables(如上述permitted(i))供 processes 做 local spin 用,完全保留了原始 algorithm 原有的 safety property,變更的只是 processes 在做 local spin 時暫時停止執行原始 algorithm 指令,等待其他某 process 進 CS 後在 exit region 以 remote write 叫醒自己恢復執行原始 algorithm 指令。困難的是,要如何確保一定存在某 process 進 CS?基於原 algorithm 具有的 progress property,如果沒有設置 local spin 的話,必然 存在一個 process j 可進入 CS。本文所提 generic approach 的一項重要工作在於尋找 local spin 適當位置以滿足兩條件:(1)上述 process j 絕對不會做 local spin,且(2)所有 做 local spin 的 process 絕對不會妨礙 process j 進 CS。則 process j 在 exit region 時會 釋放(叫醒)所有正在 local spinning 的 processes,讓整個系統又可以繼續執行原始 algorithm 的正常指令,不會因為 local spin 而陷入 deadlock。
如何選定 local spin 適當位置,可依上面兩條件分別說明。【條件 1】:執行 P-loop 受到阻擋者不會是將來要搶先進 CS 者,將 local spin 設在 loser path 上,就可排除 process
j 做local spin 之可能性,因為 process j 每次經過 P-loop 時都通過(但在 S-loop 時可能 受到幾次阻擋)。【條件 2】:因為不更改原來 program structure,基本上做 local spin 者只是暫停,不可能做出妨礙 process j 進 CS 的動作,但是它有可能因為在 P-loop 中 太早就判定自己是 loser 而進入 local spin 等待,本應依原有 algorithm 與 process j 有些 互動而促成 process j 搶先進 CS,卻因為太早『不作為』而消極性地妨礙到 process j 進 CS。事實上,loser 之判定即使過度拖延也不會引起錯誤,僅會影響到 local spin 之成效。
因此,將 loser 之判定適度延後是比較安全。實務上在處理個別 algorithm 時,若能瞭解 作者對於 progress property 之證明,就很容易找到設置 local spin 不早也不晚的適當位 置。有了適當位置,得到 local spin algorithm 的明確版本之後,可仿照原作者 progress property 之證明得到新 algorithm 的 progress property 之證明。萬一證明失敗,可再找更 晚一點的 local spin 位置,再嘗試證明。如此才真正回答了前段的困難問題。
總而言之,the generic approach 必需維持與善用原始 algorithm 之正確性:(1)local spin 機制應使用額外設置的 variables,以維持原始 algorithms 既有的 safety property,(2)
local spin 機制設置點之選擇應善用原始 algorithms 既有的 progress property 來預防 local spin 可能引起的 deadlock。