RTS
Clock-driven approach 只在 deterministic 的系統中才有用,因為她必須預先知道相當多有關 job 的資訊,只有少數符合 deterministic framework 的 aperiodic and sporadic jobs 才可以使用。
至於一般的 periodic task 限制條件如下 :
對於符合標準的 periodic task 我們用 4-tuple 來表示其行為 :
代號 | 意義 |
---|---|
phase | |
period | |
execution time | |
relative Deadline |
ex: (1, 10, 3, 6) : 第一個 job 在 time 1 時 release; 下一個 job 在 time 11 release; 所需最大執行時間為 3; 必須在 time 7 前完成; utilization = 0.3。
一般來說,所有的 task phase = 0 也就是一開始就可以執行,其 relative deadline 就等於 period,也就是下一個 job release 前。因此有時候會將 4-tuple 省略成 3-tuple(省略 phase) 或是 2-tuple(省略 phase + relative deadline)
上述有提到,符合某些條件下 aperiodic jobs (無法預測 release 的時間點)是可以被執行的,主要是因為其並不存在 hard deadline 因此只需要在 clock-driven 有空閒時去執行即可,但對於有 hard deadline 的 sporadic jobs 就不被允許使用 clock-driven approaches。此外,接下來的 approach 將 focus 在 one processor 的情況。
clock-driven 主要是使用在存在很多 periodic job 的系統,但 clock-driven 其實也可以處理 aperiodic jobs。
在作業系統中存在一個專門儲存 aperiodic job 的 queue,所有 aperiodic job 都會被放入 queue 中,因此系統就不需要花心力在 aperiodic job 上,而是有空閒時直接從 queue 裡面拿即可。
queue order :
那麼 queue 裡的順序是怎麼排序的呢?其實是根據應用來決定,包含 priority. FIFO。
在 Off-line 時期會先根據 jobs 的 hard deadlines 和其他 timing constraints 建立一個 static schedule,在執行時期 scheduler 會照著該 schedule 分配(dispatch) job 來執行,而每個 job 的 processor time 會相當於他的 maximum execution time 且在系統中的 job 不存在 overrun 的情況下,每個 job 一定都會 meet deadline。
overrun : 系統在執行時期可能會發生一些意外或是錯誤導致 job 在執行時超過他的 deadline
example 1 :
Task | parameter | utilization |
---|---|---|
(4, 1) | 0.25 | |
(5, 1.8) | 0.36 | |
(20, 1) | 0.05 | |
(20, 2) | 0.01 |
total urilization : 0.25 + 0.36 + 0.05 + 0.01 = 0.76 < 1 => 未 overrun
hyper-period : [4, 5, 20, 20] = 20
只要找出 hyper-period 後接下來只需要複製貼上這一段的排程就可以完成這一個 schedule
hyper-period : tasks period 的最小公倍數
下方為一條根據上方條件任意創造的 schedule :
這樣的排程中間存在著一些 not used interval,在這些 interval 的區段內 processor 處於 idle 階段其實可以拿到做其他事情 :
Table to store schedule
可以利用 table 的形式去儲存 schedule 上 processor 的狀態 :
k | ||
---|---|---|
0 | 0.0 | |
1 | 1.0 | |
2 | 2.0 | |
3 | 3.8 | I |
4 | 4.0 | |
5 | 5.0 | I |
6 | 6.0 | |
7 | 8.0 | |
8 | 9.8 | |
9 | 10.8 | I |
10 | 12.0 | |
11 | 13.8 | |
12 | 14.8 | I |
13 | 16.0 | |
14 | 17.0 | I |
15 | 18.0 | |
16 | 19.8 | I |
Timer
系統會利用 timer 來喚醒(interrupt)接下來要處理的 job,通常 timer 會照著 entry(k) 的順序去將 timer 設為對應 entry 的 decision time(),當時間到時(expire),timer 就會被設定成下一個 entry 的 decision time,並上一個 job 會自行中止,讓出 processor 使用權給指定的 job。
Pseudo code of schedule
H : Hyper-period
N : Number of entry
不斷重複執行 Hyper-period 區段的 schedule 稱為 cyclic schedule。
而利用 timer interrupt 作為驅動 job 執行的依據也就是其會被稱為 clock-driven 或 time-driven 的原因,而這一連串明確的排程也使得 clock-driven 不像 priority-driven 會有 anomalous timing behavior 的情況。
因為 schedule 發生在 off-line 時期,因此 scheduler 計算的時間可以忽略不計,因此就可以採用精確度. 複雜度較高的演算法來獲得我們想要的排程,例如某個演算法的排程結果是會取得週期的 idle,這麼一來若選擇該 schedule 就可以利用 idle 的時間來處理 aperiodic jobs。
上面例子的那種排程稱為 ad hoc cyclic schedules,就是沒有特定週期而是隨便亂排的排程會讓每次被喚醒的時間間隔都不同,又因為 timer 是由硬體來維護,不特定(或是過短)的時間可能會造成硬體設備過多的負擔(或精細度需要調高),因此我們希望可以找到一個 structure 將 decision time 週期化,並且需要每個週期可以拉長,也就可以節省硬體消耗。如下圖 :
t
: 為 schedule time,代表下一次要被 wake up 的時間點f
: 為兩個 decision time 的時間間隔,而這樣的區間又稱為 frame,f 為 frame size。改進目標
: 希望設定一次 timer 可以執行多個 jobs,而整個 schedule 的執行是不變得scheduler 只在 decision time 時 wake up,這也意味著在 frame 與 frame 之間不存在任何的 preemption 因為 scheduler 處於 sleep 的狀態。
選擇 frame size 的條件 :
t'
> frame t
: 那麼該 job 將會在下一個 frame 才會執行且須確保該 job 可以 meet deadline,因此 deadline 必須在下下個 frame 之後 : 又 t' - t
一定會大於等於 因此寫成 : t
: 該 job 在這個 frame 就可以開始執行,但為了確保 meet deadline,deadline 必須在下個 frame 之後 : 但這其實已經包含在上一個條件中Task | parameter |
---|---|
(4, 1) | |
(5, 1, 8) | |
(10, 1) | |
(20, 2) |
規則 | 結果 |
---|---|
公式(1) | |
hyper-period | |
公式(2) | |
公式(3) | 僅 f = 2 滿足 |
Task | parameter |
---|---|
(15, 1, 14) | |
(20, 2, 26) | |
(22, 3) |
規則 | 結果 |
---|---|
公式(1) | |
hyper-period | |
公式(2) | |
公式(3) | f = 3, 4, 5 滿足 |
frame size 的選擇不唯一
有時 job parameter 並無法符合上述的三個公式 :
Task | parameter |
---|---|
(4, 1) | |
(5, 2, 7) | |
(20, 5) |
規則 | 結果 |
---|---|
公式(1) | |
hyper-period | |
公式(2) | |
公式(3) | f <= 4 才滿足 => 不符合 |
這樣的情況下,通常會選擇將 job 切成多塊(partition),也就是放寬公式(1)的標準,這樣的手法在網路傳輸很常見,如過大的網路封包,通常會分成多塊,分次傳輸。
用上面的例子舉例,將 execution time 最大的 (20, 5) 切成 3 個 subtasks => (20, 1). (20, 3). (20, 1) 稱為 , ,
建立一個 cyclic schedule 主要要考量以下三點 :
這三項考量點彼此會互相影響,且若把 task 切的太碎,也會造成過度頻繁的 context switch 和 communication overhead,因此通常會在符合 frame-size constraints 的條件下選擇較少的 slice,但這樣的情況是非常難達成的。
儘管 arbitrary table-driven schedules 富有彈性但卻缺乏效率,主要是因為必須要有精準的 timer interrupt 且 timer 是基於每個 task 的 execution time 因此會造成相當高的 overhead。因此採用前面敘述的 cyclic schedule,其優點為 :
length f
將 clock-driven scheduler 修改成其 scheduling decision 只在 frame boundaries 發生。其擁有以下特色 :
圖為 cyclic executive on CPU 的 pseudocode
L(k)
為 scheduling blockcurrent block
儲存馬上將被執行的一連串 periodic job上述的 schedule 是先將 periodic job 完成後剩餘的空閒時間才去執行 aperiodic job,這其實就代表著我們將 periodic job priority 視為最高,但回到最一開始的概念, 提早完成 hard real-time job 並沒有任何好處 ,也就是 hard real-time job 只要在 deadline 前完成即可。但這樣的概念套在 aperiodic job 就行不通了,通常 aperiodic job 代表著系統中出現了一個 event 因此若 aperiodic job 可以更早被完成,也就是系統可以更早收到 event。因此最小化 aperiodic job response time 也就成為了 scheduler 的另一個目標。
縮短 aperiodic job response time 在直觀的方式其實是讓 aperiodic job 在 periodic job 前就執行,那原本擁有 deadline 的 periodic job 該怎麼辦呢?就是利用所謂的 Slack stealing 的技巧。
Slack stealing
首先先將單一 frame k 中所需的所有時間加起來為
計算 slack time :
y
time unit : slack = 在 frame 開始後,會檢查 slack 只要其大於 0,就會優先執行 aperiodic job,概念大概是只要預先保留好 periodic job 的執行時間並確保其不會 miss deadline,那麼先執行 aperiodic job 也是可以的。
Slack 其實就代表著在該 frame 中剩下的 processor 空閒時間
aperiodic job | release time | execution time |
---|---|---|
4 | 1.5 | |
9.5 | 0.5 | |
$A_3 | 10.5 | 2 |
aperiodic job | response time |
---|---|
10.5 - 4 = 6.5 | |
11 - 9.5 = 1.5 | |
16 - 10.5 = 5.5 |
Average response time = (6.5 + 1.5 + 5.5) / 3 = 4.5
aperiodic job | response time |
---|---|
8.5 - 4 = 4.5 | |
10 - 9.5 = 0.5 | |
13 - 10.5 = 2.5 |
Average response time = (4.5 + 0.5 + 2.5) / 3 = 2.5
不過大部分的作業系統並沒有提供 sub-millisecond 等級的 interval timer,因此在實際應用上,slack stealing 的技巧只能用在精準度 hundreds of milliseconds 的 periodic task 上。
sporadic jobs 和 periodic job 相同都擁有 hard deadline,但前者的 minimum release time 和 maximum execution time 並無法事先得知,也因此無法得知他的 priori,因此並無法保證他們都可以在時間內完成。
aperiodic job 並沒有 hard deadline 喔~~
當 sporadic job release 時,scheduler 會執行 acceptance test 來測試系統是否可以接受 aporadic job 使其不會 miss deadline 並且讓系統中原本的 aperiodic job 也不會 miss deadline,也就是說,acceptance test 是一個 scheduler 用來檢查釋放的 sporadic job 是否可以被 feasible scheduled 的機制。它會根據目前的 in system jobs 的排程檢查 frame 中是否有足夠的空閒時間來讓 release 的 sporadic job meet deadline。
in system jobs : 代表被排程好的 periodic job 或已經被排程和還未完成的 sporadic job,也就是說其代表著已經被排程且有 hard deadline 的 jobs
Example : Quality control system
在生產線上,假設輸送帶中出現一個有缺陷的零件並且必須在機械手臂封裝該有缺陷的零件前就移除該零件,因此系統就會發送一個 sporadic job 來移除零件,此時經過 acceptance test 後,假設系統無法排入 sporadic job 並且通知系統那麼就可以提早操作一些臨時措施如: 減低輸送帶的速度. 停止輸送帶. 警示工作人員並且請他的們手動移開。若 acceptance test 沒有即時告訴系統 sporadic job 會 miss deadeline,可能會造成 recovery action 太晚才開始而耗費更多的成本。
考慮到 multiple sporadic jobs 系統在進行 acceptance test 時計算的 slack time 必須將已經加入排程的 sporadic job 也計算進去,避免新加入的 sporadic job 去影響到原本就被排程進入的 sporadic job 的執行
上述提到會有 multiple sporadic jobs 的情況,因此系統會透過一個 waiting queue 來維護這些 released sporadic job,並且利用 EDF (Earliest-Deadline-First) 來決定 waiting queue 中 sporadic jobs 的順序
psuedo code
task 執行的先後順序為 Periodic task -> Sporadic tasks -> Aperiodic tasks
Example
Sporadic job | release time | execution time | deadline |
---|---|---|---|
3 | 4.5 | 17 | |
5 | 4 | 27 | |
11 | 1.5 | 22 | |
14 | 5 | 44 |
主要可能遇到這三個問題
發生 frame overrun 通常是以下三種情況
針對不同的場景會採用不同的 frame overrun 方式
Overrun 的 job 的結果無效
Overrun 的 job 的結果有效且對後續的 aperiodic job 是可接受偶爾延遲執行的
讓 overrun 的 job (offending job)繼續執行,這樣會導致 frame 的其他 job 延後執行
在原本的系統排程中新增或刪除 periodic job 導致整個系統需要 reconfigure,讓系統的 mode 需要重新改變,這就稱為 Mode Changes。而 Mode change 的發生是根據 mode change command 也就是系統管理者透過一些指令新增或刪除 periodic job,也可以視為新增了一個 mode change 的 job,需要將其安排到系統中去執行,因此其也存在 soft deadline 與 hard deadline 的分別:
Psuedo code
這塊不太懂
當已知 workload parameter 的 priori 且擁有全域的 clock,那就可以直接在 schedule task 在 several processor 上執行,我們可以藉由建立一個明定在某個 processor 上應該要那什麼時間點執行哪些 jobs 的 global schedule,只要 clock drift 夠小就可以按照 global schedule 去執行 job
clock drift: 即 clock 偏移,在不同 CPU 上由於計算的硬體不同,時間久了可能會產生 clock 誤差
不懂 = =
Clock-driven scheduler 在 cyclic schedule 的基礎排程 periodic tasks,而其 task information (periodic task 的數量, tasks 的 parameter)必須事先就被知道,藉此可以在 off-line 的環境下排程,並將結果存在 table 中。
frame 的設置: scheduling decision time 在 frame 的開始時間,而 scheduler 在這個時間會做兩件事情: (1) 找出被 release 的 job 在接下來的 frame 中執行 (2) 檢查在上個 frame 中的 task 是否都 meet deadline 且執行完成,若有不符合上述兩點的情況,scheduler 會採取對應的 recovery action。
Aperiodic jobs: 利用 slack time 來規範在 periodic task 執行完的剩餘時間,其也表示 aperiodic job 的可執行時間,無論是在 periodic job 前或後執行都可以喔。
Sporadic jobs: 利用 slack time 來規範在 periodic task 執行完的剩餘時間,其也表示 Sporadic job 的可執行時間,和 aperiodic job 不同的是,sporadic jobs 進入排程前會先經過一個 acceptency test,另外 sporadic queue 是採用 EDF 的順序排隊。