• 沒有找到結果。

Chapter 4  Application of ELP to NCTUns

4.1 Modifications Made to the NCTUns Simulation Engine

4.1.1 Scheduler

Figure 4.1 NCTUns Scheduler Architecture without ELP

NCTUns 網路模擬器使用 TCL 描述檔去強調網路拓樸的排列方式。在模擬執行 開始階段,NCTUns 會先讀進描述網路拓樸的檔案並設定相關的網路環境參數。

然後 NCTUns 模擬器會要求排程器 (Scheduler)開始排程事件 (它呼叫 run 函式開 始執行網路模擬)。它從事件串列中抓取一個時間單位最小的事件,循序執行。

排程器會不斷重覆執行上述的行為直到模擬結束 (當事件串列為空,或是事件時 間超過模擬結束時間)。

為了能夠將事件層平行模擬方法應用在 NCTUns 網路模擬器,在開始模擬 之前,排程器必需先算好所有點之間的最短路徑,根據 CPU 個數創出相對應的

work threads,並且準備好全域事件串列與安全事件串列。我們將展示這些修改,

在之後的小節。

在排程器內會呼叫的函式 set_Event()、schedule_timer()、cancel_timer()、

dequeue_heap()、dequeu_timer(),為了使用事件層平行方法,都需要被修改。因 為它們都會接觸到全域事件串列和安全事件串列。如 Figure 4.1 描述,在 NCTUns 網路模擬器架構裡,事件串列分成 heap 事件串列與 timer 事件串列,排程器需同 時維護這兩類事件串列。排程器也提供許多的 API 去控制它們 - set_Event()、

schedule_timer()、cancel_timer()、dequeue_heap()、dequeu_timer()。我們將簡單 的介紹這些函式的用途。

z set_Event() 安插一個新的事件 (非時間事件)到 heap 事件串列。

z schedule_timer() 安插一個新的事件 (時間事件)到時間事件串列。

z cancel_timer() 從時間串列中移除一個時間事件。

z dequeue_heap() 從 heap 事件串列中取出一個時間單位最小的事件。

z dequeue_timer() 從時間事件串列中取出一個時間單位最小的事件。

Figure 4.2 NCTUns Scheduler Architecture with ELP

Figure 4.2 展示在事件層平行方法下,排程器新的架構。使用事件層平行方 法,事件串列從原有的兩條變成三條,原有的 heap 事件串列與時間事件串列在 新的架構中成為存放安全事件的串列,新創造的事件串列,則存放還未被決定為 安全事件,及模擬進行中產生的新事件。我們必需修改上述的函式,使得事件層 平行方法可以整合進原有的 NCTUns。我們認為最簡單修改函式 dequeue_heap() 和 dequeue_timer()的方法就是將原有的事件串列 (heap and timer)視為安全事件 串列。透過這樣的方式,我們不需要去改變原有的架構,因為 worker thread 從安 全事件串列中取出事件執行,仍是先執行串列中時間單位最小的事件。不同於 dequeue_heap()與 dequeue_timer(),被修改後的函式 set_Event()和 schedule_timer(),

安插新的事件到全域事件串列,而非安全事件串列 (NCTUns 原有的事件串列)。

cancel_timer()的修改不像上述幾個函式這般容易,因為在事件層平行方法的架構 下,事件串列不再是單純的儲存未執行事件,而是根據不同種類的事件 (安全事 件或非安全事件),決定應該要把它存入安全事件串列,或是全域事件串列。因 此,要取消一個事件必需同時掃描這兩類事件串類。

無論是安全事件串列,或是全域事件串列,都應該受 lock 的保護,這是因 為上述在排程器使用的函式 set_Event()、schedule_timer()、cancel_timer()、

dequeue_heap()、dequeu_timer(),都有可能同時接觸安全事件與全域事件串列。

因此,我們使用 POSIX 執行緒函式庫提供的 API 鎖住可能會發生錯誤的關鍵區 (critical section)。

Figure 4.3 The ELP_Info Structure