• 沒有找到結果。

Thread Control Block

在文檔中 多執行緒Java處理器設計 (頁 70-73)

第四章 Java 處理器 Temporal Multithreading 架構

4.2. Thread Control Block

所有 Java VM threads 共享[6]Run-Time Constant Pool、method area、heap 的 data,

而每個 thread 擁有自己的 program counter、stack pointer、variable pointer、stack frames、

記錄每個 thread 目前在哪個 method 執行指令並且被分配一塊獨立的記憶體空間。當 Java VM 執行 context-switching 時必須備份 current thread 的相關資訊並且載入 next ready

61

thread 的執行資訊,Java VM 將每個 thread 執行資訊的儲存機制留給個別平台實作。

Thread Control Block

Entry 0 ……… Entry 15

Thread ID & state …….... Thread ID & state cls_id & now_mthd_id …….... cls_id & now_mthd_id

vp & sp …….... vp & sp

reg_valid & jpc_reg …….... reg_valid & jpc_reg

TOS_A …….... TOS_A

TOS_B …….... TOS_B

TOS_C …….... TOS_C

thread_obj …….... thread_obj

bak_prev_TH_we previous_thread_id

new_thread_id

TH_data_in

new_thread_flag DCC2JAIP_info

thread_dead monEn_fail_en monEx_nxtOwn_en running_thread_id

TH_data_out

圖 47 每個 Thread 儲存在 Thread Controller Block 內的執行資訊

圖 47描述 Thread Control Block 的儲存結構。每個 thread 的執行資訊皆由 8 個 32-bits special-purpose registers 所組成的集合。而每個 thread 所需要被記錄的執行資訊分別為:

(1) Thread ID (2) Thread state

(3) thread 目前所執行的 class 與 method ID (4) Java program counter

(5) stack memory 使用情形,包括 Variable pointer 和 Stack pointer (6) thread 目前所執行的 method 其 local variable 個數

(7) Two-level Java Runtime Stack 最上方的三筆資料(TOS_A、TOS_B、TOS_C) (8) Thread object reference

不同於先前的設計,我們使用一個大小為 2KB 的 on-chip block RAM 來暫存上述第

62

(2)項至第(8)項所有 threads 的執行資訊,使用 on-chip block RAM 暫存即時性運算資料可 減少 registers 與 LUTs 的使用,並且只需花 1 clock 讀寫儲存的資料。Thread Control Block 可容納的 thread 數量目前最多 16 個,如果要擴充 Thread Control Block 可容納的 active thread 數量,我們只需加入幾條位置訊號線就可以存取 on-chip block RAM 中其餘未被 使用的位置。

然而選擇存放這些資訊的原因是:透過存放 thread ID,可讓 Thread Controller 可直 接透過 thread ID 到 Thread Control Block 取得執行緒資訊。為了支援同步機制的電路,

在我們的設計下使用 2 bits 表示 thread state,二進位數值 00 代表這個 thread 已經終止執 行或者不存在,01 代表 waiting state,10 代表 ready state。記錄 class 與 method ID、Variable pointer、Stack pointer 以及 Java program counter 這些訊息是 JAIP 在執行程式時的必要資 訊。而 thread 目前所執行的 class 與 method ID,以及 current method 的 local variable 個 數,是藉由每次呼叫方法時 DSRU 對 stack memory 的操作。因為在 Ping-Pong Java Stack 之中每個 2-level runtime stack 包含 4 registers 放置讀寫頻率較高的 local variable 0 到 3 [3],所以需要 local variable 個數來判斷 current method 對於這 4 registers 的運用情形。

而在 Two-level Java stack memory 中第一層僅使用 3 registers 來放置 stack memory 最上方 的三筆資料,藉以提高 JAIP 的執行效率。因此為了減少在 thread 切換時造成的成本耗 費,因此我們選擇直接將這 3 registers 放置於 Thread Control Block,使得在切換時只要 直接替換 JAIP 所使用的這 3 registers 即可,而不用再從第二層的 interleaving stack memory 中取出來更新這三個暫存器。以下個別說明 Thread Controller 更新 Thread Control Block 的幾種情況:

 產生 new thread。根據圖 21與圖 42,當 ICCU_new_TH 等於 1 時,new_thread_flag 等於 1 並且啟動 Thread Controller 新增 thread,直接把 register new_thread_id 的數值 分配給 new thread 之後再自行累加一個單位。再從 Thread Control Block 內部尋找閒 置的 entry (圖 47),分配給 new thread 寫入下列執行資訊:(1)DCC2JAIP_info 此時 儲存 new thread 必要的執行資訊例如起始 class ID、method ID 與 Thread object reference,將這些資訊寫到 Thread Control Block 內部的 on-chip block RAM (2)其他

63

執行資訊如 vp、sp、jpc_reg 等皆寫入預設值即可(3)new thread 的 ID number 與 thread state 同樣寫入到 Thread Control Block。

 當 Thread Controller 狀態為 Backup_previous_TCBinfo,此時 previous thread 最新的 執行資訊存放在 Bytecode Execution Engine(如圖 45),Thread Controller 參考 previous thread ID 的值(previous_thread_id)到 Thread Control Block 查詢對應的 entry,再把 previous thread 執行資訊從 Bytecode Execution Engine 透過 TH_data_in 依序寫入 Thread Control Block。

 Thread Controller 利用內部 register running_thread_state 與 prev_thread_state 記錄 current thread state,當 current thread 執行 monitorenter 指令取得 lock obejct 失敗時,

ICCU 輸出訊號 ICCU_monEnter_fail = 1 將會觸發 Thread Controller 的內部信號 timeout=1,此時必須等到 Thread Controller 的狀態為 Check_Timeout 並且 timeout 等於 1 才可以把 running_thread_state 的值改為 01(表示 waiting state)。下個狀態進入 ContextSwitch,running_thread_state 內容此時傳給 prev_thread_state,接著再進入 Backup_previous_TCBinfo 狀態。此時如同前一個情況,把 prev_thread_state 的數值 寫到 Thread Control Block 裡面 previous thread 對應的 entry。

 當 current thread 執行 monitorexit 指令,要將 lock object 權限轉移到別的 JAIP 底下 某個 thread 的時候,DCC2JAIP_info 的值代表下一個 lock 擁有者的 thread ID,首 先該 JAIP 的 ICCU 的 ICCU_monExit_nxtOwner 訊號等於 1,表示此 Thread Manager Unit 底下有某個 waiting thread 將被改回 ready state,DCC2JAIP_info 的值被傳到 Thread Control Block,查詢對應的 entry,最後修改 thread state 為 01(表示 ready state)。

 當 current thread 終止執行時,Thread Controller 的 thread_terminate 等於 1(圖 42)並 且讀取 running_thread_id 的值到 Thread Controller 查詢對應的 entry (圖 47),此時 thread state 改成 00 即可把這個 entry 回復到閒置的狀態。

在文檔中 多執行緒Java處理器設計 (頁 70-73)