• 沒有找到結果。

The proposed generic approach

基本理念是要在原有 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個競爭者(kn)在 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。

相關文件