# Commonly Used Approaches ###### tags: `RTS` ## Clock-driven approach 又稱為 **time-driven**,他的 scheduler 在什麼時間點要做什麼事情在一開始就決定好了,也就是在系統開始執行(**off-line**)之前 **time instants** 就被決定,也就是說,schedule 的計算是在 **off-line** 就計算好了,因此 run-time 時的 scheduling overhead 將會被最小化。而 `hard real-time` 中其參數是固定且被知道的。 通常 scheduling 採取的手段是 regularly spaced time instants,也就是必須是週期性的如: 每過一個小時鬧鐘會響起,而為了達成這樣的要求,也就必須使用 hardware timer 來設定週期性的響起(awake scheduler),藉此 scheduler 就不需要去維護該 clock Scheduler : 1. 選擇當初被排程好,應該要被執行的 job 2. 分配 processor 和 resource 給該 job 3. 讓 job 執行直到下一個 decision time 4. 更換 job 5. 更換完後 scheduler 會將自己 block (**sleep**) 6. 等到下次 timer expiration 時,scheduler 會被喚醒(Awakes)並重複 (1) ## Weight round-robin(RR) approach 通常被使用在 ==time-shared== application。round-robin 的概念即是**輪流**,每個人使用完後換下一個,實做的方式是利用 First-in-first-out(FIFO) 的 queue,在 queue 的 head 的 job 則會被最先執行。在 round-robin 中保證公平,每個人將會使用固定的時間(time slice),其也是一個最基本的時間單位,用來分配 job 使用 processor 或 resource 的時間,那 time slice 要如何決定呢?通常會設成數十個 milliseconds,並且會根據應用的需求來決定 time slice 是多少。 :::info time slice 選擇其實相當重要,不希望 job 在 time slice 的一開始就完成留下剩下很多的 idle,造成資源的浪費 ::: 通常 job 都無法在一個 time slice 就完成執行,因此未執行完成的 job 會被 **preepemted** 並且放回 queue 的最尾端等待下次被執行,否則可能會造成一個 job 不斷在佔用資源,其他的 job 則需要等待非常久才可被執行。另外,通常 time slice 都不會太長,因為希望每個 jobs 等待時間不要太長,就可以感覺每個 job 都是等待一下就又馬上被執行。我們假設 processor 的時間總和為 1,每個 job 得到的 processor 時間則為 ==$1/nth$==; n 為 job 的數量。也是因為上述的定義,round-robin 又被稱為 ==processor-sharing== algorithm weighted round-robin 根據不同種的 job 會給予不同的 weight,而 weight 代表 processor 給了多少的 time slice 給該 job,如: weight = wt 代表該 job 每一 round 會獲得 wt 個 time slice,而 weight 其實也代表了該 job 的重要性差異,因為透過這樣的機制可以去加快(speed) job 或延遲(retard) job 的完成時間,而這樣的技巧也常被使用在 **high-speed switched networks** 這樣的技巧雖然能讓 job 以公平且看似不斷被執行的方式排程著,但缺點是會拉長每個 job 的 completion time,一旦 task 中的 jobs 存在著 precedence constrained(一定要某些 job 完成後才可執行的 job) 就會造成大量的 processor idle 且 response time 會變得非常大 * Round-robin for pipeline 某些情況下,pipeline 可以解決 precedence constrain 的問題,下圖為兩種 time slice 下 pipeline 的示意圖 ![](https://i.imgur.com/JQr1Ljo.png) 上圖的 time slice 較小,讓 $J_{11}$ 和 $J_{21}$ 幾乎同時執行完 下圖的 time slice 較大,讓 $J_{11}$ 先執行完後,processor 2 就可以開始執行 $J_{12}$ 讓整個完成時間提前 * high-speed switched networks 使用到 **Round-robin for pipeline** 好處是收到 message 的前面一部分時,即可開始做傳輸,並不需要等整個 message 都收到後才開始進行傳輸。另外,利用 Weight RR 僅須一個簡單的 FIFO queue 就可以完成,而不需要另外使用 sorted 或 priority queue,也就是可以降低成本 ## Event-driven approach 又被稱為 **priority-driven** algorithm,其絕不會讓任何 resource idle 除非是已經沒有任何需要執行的 jobs,而這邊的 resource 包含 processor 和 passive resource,而 scheduling decision 會在 event (release of jobs occur or completions of jobs occur) 發生時發生。 * release of jobs : 代表有 job 被 release 也就是有新的 job 進來時 * completions of jobs : 代表有 job 完成時 ### Greedy scheduling 另外也被稱為 *list scheduling*, *work-conserving scheduling*,為什麼會被稱為貪婪呢?因為 priority-driven 總是希望可以 locally optimal,也就是如果有 resource 是 avable 且可以被使用,那就一定會提供給 job 使用而不會讓她等待。 ### List scheduling priority-driven 是根據優先權來決定她得執行順序,當 job 可被執行時,會被放進 queue 中,而放進 queue 中則是按照 job 的 priority 來決定,在任何一個 decision time 總是會先選擇 priority 高的 job 來執行。這也代表的其實 priority-driven algorithm 就是藉由 list of priority 來選擇 job。 ### Priority 指的是每個 job 的優先權,也就是當兩個 job 要競爭同一個 resource 時,會根據 priority 決定誰先拿到該 resource。而通常在 non-real-time system 會使用 priority-driven 因為其變動的原因較大,因此比較無法掌控 hard constrain 的完成度或是即時性,而 scheduler 會根據 `release time` 和 `execution time` 來決定其 priority * release time * FIFO(First-In-First-Out) * LIFO(Last-In-First-Out) * execution time * SETF(Shortest-Execution-Time-First) * 需要的執行時間最少,代表可以越快做完越快出去 * LETF(Longest-Execution-Time-First) * 需要的執行時間最大,就讓她越早開始時間 因為我們可以動態的去改變 job 的 priority,因此其實 round robin 也可以被視為是 priority-driven,因為 round robin 會將已經執行完 time slice 的 job 排到 queue 的最後面,也就相當於將該 job 的 priority 調到最小。 下圖是 priority-driven 的圖解 1. Preemptive ![](https://i.imgur.com/EcESdz1.png) * 是一個 precedence graph * edges 代表 precedence constrants * $J$ 旁邊的數字代表其 execution time * 除了 $J_5$ 的 release time = 5 外,其他都是 0 * 這些 job 會藉由 shared memory 進行溝通,因此可忽略 communication * 編號越小的 priority 就越高 * 所有的 job 都是 reemptable * Scheduling decision 為有 job 被 release 或有 job 完成執行的時候 ==time 0== * 僅有 $J_1 J_2 J_5 J_7$ 可以被執行 * 有兩個 processor 可以執行,因此根據 priority 選出 $J_1 J_2$ 先執行 ![](https://i.imgur.com/GhOhMDP.png) ==time 1== * $J_2$ 完成執行 * 根據 greedy 並不會允許資源閒置,因此選擇 priority 較高的 job * 因為 $J_2$ 的完成,使得 $J_3$ 被 release 又 $J_3$ priority 較 $J_5 J_7$ 高,因此先執行 $J_3$ ![](https://i.imgur.com/1N3QLSG.png) ==time 3== * $J_1 J_3$ 完成 * 目前的 queue 中有 ${J_4, J_7}$ * 因 $J_5$ release 未到,因此還不能被執行 ![](https://i.imgur.com/TKAv7QN.png) ==time 4== * $J_7$ 未完成但 $J_5$ release,因為是 preemptable 所以需要先執行 $J_5$ 而中斷掉 $J_7$ ![](https://i.imgur.com/LXTC1r0.png) ==time 5== * $J_4$ 完成,因此開始執行剩下的 $J_7$ ![](https://i.imgur.com/w5rdGaT.png) ==time 6== * 只剩 {$J_8$, $J_6$} 未被執行 * 但其 precedence $J_7$ 還未完成,因此 idle ![](https://i.imgur.com/tXMkhkT.png) ==time 8== * $P_1$ 的 reponse time 為 12 * $P_2$ 的 reponse time 為 9 ![](https://i.imgur.com/pezZ18T.png) 2. Non-preemptive * 兩者的差別在於 ==time 4== 時,因為 non-preemptable 的關係 $J_7$ 沒有被換成執行 $J_7$,這也導致了後續的排程不同 * $P_1$ 的 reponse time 為 11 * $P_2$ 的 reponse time 為 8 * 整體的 response time 減少 ![](https://i.imgur.com/59trfgl.png) 3. preemptive v.s. non-preemptive 在正常情況下,preemptive 的效果會較 non-preemptive 好,但又會在某些特殊例子下得到相反的結果,並且 non-preemptive 和 preemptive 間又找不到決定何者較優的關鍵條件。不過在 preemptive 的情況下,需要用到較多的 context-switch,也就會導致 cost 的增加,進一步來說,若 cost 小到可忽略,preemptive 基本上會比 non-preemptive 優。 * **Coffman and Garey (CoGa)** 證明了在 two processor 且 cost 可被忽略的情況下,non-preemptive 的 minimum makespan 絕不會超過 preemptive 的 minimum makespan 的 $4/3$ 倍 ## Dynamic v.s Static System ### Dynamic systems - migratable 上述 priority 的例子中,$J_1~J_8$ 共用一個 queue 並輪流到 processor 1~2 上執行的 multiprocessor system 被稱為 dynamic system,可以根據不同的 processor 狀態,動態的決定 job 要被放到哪個 processor 上執行。 * `migratable job` : 當有一個 job 在 processor 中執行到一半被 preempt 掉,再後來可被執行時,可被放到另一個 processor 上執行,則稱該 job 為migratable。eg: job from processor 1 migrates to processor 2 ### Static system 在一開始就將 job 分群到不同 prioriy 的 queue 上,而不同的 queue 就會被分到相對應的 processor 上執行,除了 job 改變或 processor 損壞... 等不可抗力,否則 job 都不可被轉移到別的 processor 上去。 * `Synchronize` : 若在不同的 processor 上執行的 jobs 具有相依性,則 scheduler 需要採取 synchronization 或 resource access-control protocol(shared memory) 來達到同步。 * `Schedule independent` : 對於 jobs 而言,每個 processor 的 scheduled 是各自獨立的 用上面的例子舉例 : * 將 job 分成兩群 ${J_1, J_2, J_3, J_4}, {J_5, J_6, J_7, J_8}$ * ${J_1, J_2, J_3, J_4}$ => $P_1$ * ${J_5, J_6, J_7, J_8}$ => $P_2$ ![](https://i.imgur.com/t6hNIUY.png) ### Dynamic v.s Static 直覺上,dynamic system 可以得到較好的 average response time,但 dynamic 的 worst-case real-time performance 常常會比 static 來的不好。且目前沒有任何的方法可以驗證 dynamic system 的 timing constrains 是否都被滿足,但 static system 卻有足夠的驗證方法,也因此,大部分 hard real-time system 大部分都是採用 ==static==,在一開始就將 jobs 分群,並且在固定 processor 上執行。 ## Effective release time and deadline job 本身有 release time 和 deadline 的 constaints,而 jobs 之間存在著 precedence constraints,而這兩者的 constraints 可能並沒有保持其一致性。 :::info **inconsistent** 今有 $J_1, J_2, J_3$,$J_1$ 執行完後才可執行 $J_2$,$J_2$ 執行完後才可執行 $J_3$。 但 $J_2$ 的 release time 可能早於 $J_1$ => 這樣並沒有意義,因為 $J_2$ 還是必須等到 $J_1$ 執行完後才可執行。 $J_3$ 的 deadline 比 $J_2$ 還來的早 => $J_2$ 的 deadline 較晚,可能導致$J_3$ miss deadline。 ::: 也因為一致性的問題,並不會去使用 job 本身的 release time 和 deadline,而是透過其他方式去取得與 precedence constaint 一致(consistent)且吻合的 effetive release time 和 deadline 作為 timing constrants。那要如何計算呢?以下是在 ==one processor 且 preemptable== 的情況下 : * Effective Release Time * 若該 job 無 predecessors,則該 effective release time = job's release time * 若該 job 有 predecessors,則該 effective release time = job's release time 和所有 predecessors' effective release time 的最大值 * 可以利用 one pass 的方式,也就是根據 precedence graph 從第一個掃到最後一個,時間複雜度為 $O(n^2)$ : ![](https://i.imgur.com/nO9UHQl.png) * Effective Deadline * 若該 job 無 successor,則該 effective deadline = job's deadline * 若該 job 有 successor,則該 effective deadline = job's deadline 和所有 successors' effective deadline 的最小值 * 可以利用 one pass 的方式,也就是根據 precedence graph 從最後一個掃到第一個,時間複雜度為 $O(n^2)$ : ![](https://i.imgur.com/KjFejCU.png) * 更精準的算法 : 考慮到 execution time * effective release time = predecessor's release time + execution time * effective deadline = successor's deadline - execution time :::info Gary and Johnson (GaJo77) : 只要 effective constraint feasible 那麼原本的 constraints 也會 feasible ::: ### Swap 在計算出 effective timing constaints 後,其實就可以忽略 job 間的 precedence constraints 並將 job 視為 independent,但這樣可能會發生問題(invalid)。原存在 precedence constraint 的 $J_1, J_3$ 的 release time 和 deadline 完全相同(2, 8),那麼 scheduler 就可能會將 $J_3$ 排在 $J_1$ 前先執行。 ![](https://i.imgur.com/Omp6Imn.png) 解法 : ==利用 swap 的機制== 在演算法後面加入一段邏輯,若將 $J_3$ 排在 $J_1$ 後面的話,就將兩者 swap,透過簡單的 swap 機制,就可以將 invalid 的 schdule 轉換成 valid 的 schedule ## Optimality of the EDF algoritm :::info Earlies deadline first (EDF) algoritm 通常 job 的 priority 會根據其 ==deadline== 來給定,因為越快 deadline 的 job 通常需要越早執行完畢。 ::: EDF 以下情況下,就是一個 optimal 的 scheduler : * one processor * preemptive * job 之間沒有互相競爭 resource (non resource dependency) ### Theorem 在 preemptive, job do not contend for resources, one processor 且該群 job 確定存在 feasible schedule 的情況下,EDF 為 optimal > When preemption is allowed and jobs do not contend for resources, the EDF algorithm can produce a feasible schedule of a set J of jobs with arbitrary release times and deadlines on a processor if and only if J has feasible schedules. ### Proof 在任何的 feasible schedule 中,都一定可以轉換成 EDF 的形式。 ![](https://i.imgur.com/HaZqJZj.png) * $J_i$ 被 schedule 在 $I_1$,$J_k$ 被 schedule 在 $I_2$ * 原 schedule 中,$J_i$ 的 deadline 在 $J_k$ 後,但 $J_i$ 的 priority 卻比 $J_k$ 高 根據不同的 release time 分成兩種 case : 1. $J_k$ 在 $I_1$ 之後才被 release ![](https://i.imgur.com/McPkXTe.png) 這種情況下,$J_k$ 不可能在 $I_1$ 的期間被執行,而這也就代表其排程本來就為 EDF。 2. $J_k$ 在 $I_1$ 之前就被 release ![](https://i.imgur.com/MFMx695.png) 這種情況不符合 EDF。因此利用 ==swap== 來轉成 EDF。 首先利用 $I_1, I_2$ 的大小做區分 : 1. $I_1$ < $I_2$ 將 $I_2$ 分成兩份,其中一份與 $I_1$ 相同,並將其移到前面執行。 再將 $J_i$ 的區段移到 $J_k$ 的後面執行。 ![](https://i.imgur.com/PZnxYEJ.png) 2. $I_1$ > $I_2$ 將 $I_1$ 分成兩份,其中一份與 $I_2$ 相同,並將 $J_k$ 移到 $J_i$ 的前面執行。 再將 $J_i$ 的還沒執行完的區段移到 $I_2$ 執行。 ![](https://i.imgur.com/fuVgA8t.png) :::info 透過不斷重複上述的 swap,最後就可以得到符合 EDF 的 schedule ::: 因為 priority schedule 是 greedy 且 local optimal,因此不可有 idle 的情況發生,因此需要消除 idle 的部份。 * 將 jobs 往前推 * 尋找符合的 job 插入其中 ![](https://i.imgur.com/eCbSW7Z.png) ### NON-OPTIMAL situations 1. Non-preemtable jobs ![](https://i.imgur.com/RRzIwSO.png) * jobs : $J_1 J_2 J_3$ * release time : $r_1, r_2, r_3 = 0, 2, 4$ * deadline : $d_1, d_2, d_3 = 10, 14, 12$ * 在 $r_3$ 時,雖然 priority $J_3 > J_2$ 但因 non-preemptive 所以不能換 * $J_3$ miss deadline * 又其存在 feasible schedule : ![](https://i.imgur.com/UB9yBO3.png) :::success 沒 preemptable 無法排出 optimal ::: 另外這組 schedule 其實並無法被任何的 priority-driven algorithm 排程出來,主要是因為 priority-driven 採取 greedy 策略,因此不會排出有 processor idle 的情況 2. Multiple processors ![](https://i.imgur.com/9BbSn9j.png) * jobs : $J_1 J_2 J_3$ * release time : $r_1, r_2, r_3 = 0, 0, 0$ * deadline : $d_1, d_2, d_3 = 1, 2, 5$ * execution time : $e_1, e_2, e_3 = 1, 1, 5$ * priority : $J_1 > J_2 > J_3$ * time 0 時,選取 $J_1 J_2$ 執行,導致 $J_3$ miss deadline * 又存在 feasible schedule : ![](https://i.imgur.com/JB6cpop.png) * 其實只要有 priority : $J_3 > J_2$ 就可以找出該 schedule * `LST` : slack -> 0, 1, 0 -> $J_1 J_3$ 先執行 ## Optimality of the LRT algorithm :::info **Latest release time (LRT)** 又被稱為 **reverse EDF**,方式是將 release 和 deadline 交換後,並從後面開始 schedule jobs,也就是從 latest deadline 開始執行,並且使用 priority-driven manner,也就是用 assign priority 的方式。 ::: 通常 scheduling 的目標是要讓 job meet deadlines,但其實只要在時間內完成即可,將 job 提早做完並沒有任何好處。且對於某些 soft real-time job 他們的 response time 對他們來說是非常重要的,因此會透過延後 hard real-time job 的 execution time 提早執行 soft real-time job 藉此讓其可以提早完成。 :::warning 哪些時候 soft real-time job 提早完成會比較好? ::: 上述提到 LRT 是使用了 assign priority 的方式,那麼要怎麼給定 priority 呢? ==release time 越晚的 job 其 priority 越高==,不過這樣的排程可以會造成 processor 的 idle,不符合 greedy 的策略,因此她並不是 priority-driven algorithm。 ==範例== ![](https://i.imgur.com/5HLIh4E.png) * $J_1 J_2 J_3$ * 右邊的字數代表 execution time * 區間為 (release time, deadline] * 可以看到 $J_3$ 的 deadline 為 8 (latest) * 視 latest deadline 8 為 release time 0 往回推其他 job * 根據原 release time 給予 priority -> $J_2 > J_3 > J_1$ ![](https://i.imgur.com/UgqIlML.png) * `time 8(0)` : $J_2$ ready,因此被放進 schedule * `time 7(1)` : $J_3$ ready,但 priority 低於 $J_2$,因此繼續執行 $J_2$ * `time 6(2)` : $J_1$ ready $J_2$ complete,因 priority: $J_3 > J_1$ 因此排 $J_3$ * `time 4(4)` : $J_3$ complete,$J_1$ 排進去摟 * `time 1(7)` : $J_1$ complete,排程結束。但可以看到 execution 並不是在 time0 開始,也就是說 processor 在 time 0-1 期間 idle,此舉不符合 greedy => 非 priority driven algorithm(但是符合 priority-driven manner) ### Optimal LRT 1. preemption 2. 不競爭 resource 3. one processor ## Optimality of the LST algorithm :::info **Least-Slack-Time-First(LST)** 又被稱為 Minimum-Laxity-First(MLF) algorithm,排程也是 priority-driven manner,是 slack 越低 priority 越高,也就是其需要執行的需求越急迫 ::: 那什麼是 slack ? 在 time t 且 job deadline 為 d 時 $slack (laxity) = d - t - (執行中剩下的執行時間)$ ![](https://i.imgur.com/vpzDrcV.png) * 範例中,$J_1$ 在 time 0 $slack = 6(deadline) - 0(current time) - [3(execution time) - 0(current time)]$ * 只要 job 被執行,該 job 的 slack 就不會變動 $6 - t - (3 - t) = 3$ * 假設在 time 2 時,$J_1$ 被 preempt 成 $J_3$ 並執行兩秒 * 在 time 4 時,$J_1$ 的 $slack = 6 - 4 - 1 = 1$ :::info 只有在正在執行中的 job 其 t 可抵銷,slack 固定 ::: ### Optimal LST 1. preemption 2. 不競爭 resource 3. one processor ### Compare to EDF |項目|EDF|LST| |--|--|--| |須知|deadline only| deadline and execution time for slack| |缺點|...|actual execution time 只在 job 完成時才會真的知道| 估計 execution time 時,會給定一個執行時間的範圍 $[e_i^-, e_i^+]$,通常 LST 在計算 *slack* 時,會採用 maximum execution time ($e_i^+$) 作為執行時間,來確保不會 miss deadline。另外在 sporadic 或 aperiodic job 的 *slack* 計算上,因為 execution time 較難估計,所以不好算。 ## Anomalous behavior of priority driven ### Clock-driven vs. Priority-driven Priority-driven 相較於 Clock-driven 擁有更多的優點 : 1. 較易實做 因 priority-driven 可以利用非常簡單的 priority 給定方式即可實做出來,如利用 EDF 的方式。 2. run-time overhead 低 因為只須 maintain priority queue 也就是一個儲存 jobs 的 memory 即可,因此可以壓低非常多。 3. 彈性好,容易適應變動下的條件 clock-driven 需要在系統開始前就得到相當多的 information ,如 release time. execution time 並且直接利用這些預設值去 schedule,而 priority-driven 則僅須 job 的 priority 就可以 schedule,因此若在執行過程中 timing constraints 或 require resource 有變動時,priority-driven 是擁有較大的彈性去適應這樣的變動。 儘管 priority-driven 擁有這麼多的好處,也並沒有在 hard real-time 系懂中被廣泛的應用。主要是因為其 timing behavior 是會變動的且無法被事先決定的,因此非常難去預先驗證(validate) deadline 是否有被滿足,也就是不能保證 job 不會 miss deadline。 :::info validation problem (LiHa) 在給定 jobs. jobs 可使用的 resource. scheduling algorithm 的情況下,就必須可以得知該情況是否有 job 會 miss deadline。 ::: ### Anomalous behavior validation ![](https://i.imgur.com/llQx9PP.png) * 四個獨立(indepedent)的 jobs * 在兩個完全相同的 processor 上排程 * processors 上使用同一個 priority queue * priority : $J_1 > J_2 > J_3 > J_4$ * 因為是單一 queue 可以被排程到不同的 processor 上,因此是 ==dynamic system== * preemptable * 不行 migrate,也就是 job 只能在特定某個 processor 上執行,不可被分配到另外一個執行 * $J_2$ 的 execution time 是變動的 $[2, 6]$ ==[暴力法]== 假設我們想要驗證系統是否能 1. meet 所有的 deadlines 2. 控制每個 job 的 completion-time jitter 不超過 4 > maximum completion time - minimum completion time <= 4 ![](https://i.imgur.com/zw5izUx.png) * 圖 (a) : 利用 $J_2$ 的 maximum ==execution time 6== * 圖 (b) : 利用 $J_2$ 的 minimum ==execution time 2== * completion time jitter 須逐個檢查 $J_1 = 0, J_2 = 6 - 2 = 4, J_3 = 13 - 12 = 1, J_4 = 20 - 16 = 4$ :+1: ![](https://i.imgur.com/6UmS8gZ.png) * 利用 $J_2$ 的 ==execution time 3== * $J_4$ miss deadline ![](https://i.imgur.com/D7PERiq.png) * 利用 $J_2$ 的 ==execution time 5== * 得到 best-case,因 ==max band ??== 也就是整個系統完成的時間最早 * 與圖 (b) 比較,得到 $J_4$ 的 $jitter = 20 - 15 = 5 > 4$ :-1: :::info 這樣的狀況稱為 ***Scheduling anomaly***,也就是結果與預期的不同。 1. 通常會認為 job 的 execution time 變少,scheduling 的結果也會更好,如 response time 會變少. max band??? 會變短...等,但卻出現了執行時間短,會發生了 miss deadline 的情況。 2. 通常會認為越多 processor scheduling 的結果也會更好,但卻得到更晚的 completion time。 3. 較少的 depedencios 也有相同的情況發生。 ::: 其實 ***Scheduling anomaly*** 不只會發生在 multipable processors 的情況,若 job 是 non-preemptable,那麼 ***Scheduling anomaly*** 也可能在 one processor 的情況下發生。 ![](https://i.imgur.com/VjQ6Yqu.png) * $J_1$ execution time 為 3 時 $J_3$ miss deadline * $J_1$ execution time 為 4 時 $J_3$ 卻 meet deadline 因為存在著 ***Scheduling anomaly*** 的情況,使得驗證 priority-driven 變得困難,因其 job parameter 是可變動的,且 release time 和 execution time 的變動是不可避免的,因此需要使用暴力法列出所有的可能,假設有 n 個 job. execution time 的變動範圍有 X 個,那麼必須花 $O(Xn)$ 的時間複雜度來驗證,這對於大型系統其實是非常耗時的,因此是一個相當不實際的作法。 ## Predictability of execution 什麼樣情況下的 priority-driven 具有可預測性? ### Validation 在即時系統中,希望的是排程的結果都可以 meet deadline,也就是希望每個 job 都可以在時限內被完成,那麼我們就需要去驗證(validate)該 scheduling algorithm 是否可以讓每個 job 都 meet deadline,而驗證的方式即是根據該 scheduler 排出的 schedule 的每個 job 的最大 completion time,藉此就可以得知該 job 是否有 miss deadline。當然,在不存在 ***Scheduling anomaly*** 的情況下,也就意味著這群 job 的執行狀況是可以被預測的,因此 validation problem 就會變得容易許多。以下都是在不存在 ***Scheduling anomaly*** 的前提下,去 validate schedule 的方式。 * maximal schedule : 該 job 中都利用其 maximum execution time 作為他的 execution time 去 schedule。 * minimal schedule : 該 job 中都利用其 minimum execution time 作為他的 execution time 去 schedule。 * actula schedule : 該 job 中都利用其 actual execution time 作為他的 execution time 去 schedule。 ![](https://i.imgur.com/0zytglT.png) * 圖 (a) 採用 $J_2$ 的最大執行時間作為 execution time,因此稱為 maximum schedule * 圖 (b) 採用 $J_2$ 的最小執行時間作為 execution time,因此稱為 minimun schedule * 而 $J_2$ 採用 execution time 為 2, 3, 4, 5, 6 則稱為 possible asctual schedule ### Predictability jobs 是否為 predictable 關係到 validation 的難易度,因此 predictable 是相當重要的。若 actual schedule 的 start time 和 complition time 可分別被 maximum schedule 和 minimun schedule 的 的 start time 和 complition time bound 住的話,就代表這些 job 在該 scheduling algorithm 是 predictable。 * $s(J_i)$ : 在 actual schedule 中,$J_i$ 被執行的開始時間點 * $s^+(J_i)$ : 在 maximum schedule 中,$J_i$ 被執行的開始時間點 * $s^-(J_i)$ : 在 minimum schedule 中,$J_i$ 被執行的開始時間點 * ==start-time predictable== : $s^-(J_i) <= s(J_i) <= s^+(J_i)$ * $f(J_i)$ : 在 actual schedule 中,$J_i$ 被完成執行的時間點 * $f^-(J_i)$ : 在 maximum schedule 中,$J_i$ 被完成執行的時間點 * $f^+(J_i)$ : 在 minimum schedule 中,$J_i$ 被完成執行的時間點 * ==complition-time predictable== : $f^-(J_i) <= f(J_i) <= f^+(J_i)$ ![](https://i.imgur.com/tjj4hEO.png) * 圖 (a) (b) 分別為 maximum schedule 和 minimum schedule * $s^-(J_4) = 2$, $s^+(J_i) = 6$ * $s^-(J_4) <= s(e(J_2) = {3, 4, 5}) <= s^+(J_4)$,因此 $J_4$ 為 start-time predictable * $f^-(J_4) = 20$, $f^+(J_i) = 16$ * $f^-(J_4) <= f(e(J_2) = {3, 4, 5}) <= f^+(J_4)$ ==不成立==,$J_4$ 不為 completion-time predictable :::info 當 job 同時為 start-time preditable 和 completion time predictable 時,稱該 job 為 predictable。 若全部的 jobs 都是 predictable 代表其 execution behavior 皆為 predictable,而該系統也為 predicatable。 ::: 因此該系統不為 predictable ### Predicatable 的條件 1. job 間彼此獨立 2. preemptable with fixed release time 3. one processor 這也就代表著在上述條件下的 priority-driven 容易被 validate,也因為所有 job 的執行行為都是可預測的,因此我們可以忽略 execution time 可能的變動,僅利用 maximum execution time 作為 execution time 來得到 maximum possible response time。反之,只要違反任何一項條件,該系統即為 unpredictable 而不好被 validate。 --- ## Validation algorithm validation algorithm 是一種用來判斷系統中所有的 jobs 是否符合其 timing constraints 的演算法,若該 validation algorithm 判定該 schedule 為可行就真的可行,就其稱為 correct validation algorithm。雖然對於 static system 的 validation algorithm 已經發展的相當成熟,但對於 dynamic, priority-driven systems 還不夠成熟,主要是因為 static 的 job 在執行前就已經確定好,因此相對於其他種,他的變化性與排程的異常現象存在都比較少。 ### 效能指標 validation algorithm 不只要求正確更要求效能上的成果,而效能主要可以由下方三個方面去評斷 * `Complexity` * `Robustness` : 即使 workload model 有一些缺陷(not valid),該 validation algorithm 仍然能保持 correct,就稱其為 robust。 :::success 一般來說,根據所有在 workload model 中的假設都為 valid,才稱該 algorithm 為 correct。 ::: :::info 不過在給定一些錯誤的 workload model 的情況下,還能得到正確得結果也就意味著該 algorithm 對於 run-time environment 的要求並不是那麼精準。那麼什麼叫做 not valid workload model 呢?假設 job 皆為週期性且執行時間固定,不過現實中卻存在著像 release-time jitters 或 variation in execution time 的微小變化,那該 validation algorithm 可否應付這件事情,也就代表的其 robustness 的指數。 此外我們要衡量時,其實只需要計算出 worst case,若 worst case 為 valid 即所有情況都 valid,至於取 worst case 的方法,通常是取一些變動的極值如 : minimum inter-release time 或 maximum execution time。 ::: * `Accuracy` : 即精確性,當 correct validation algorithm 宣稱該 schedule 不可行時,該 schedule 是否就真的不可行呢?若其實可行,就代表該 validation 雖然為 correct 卻 inaccuracy。這樣的情況發生可能是因為使用的 algorithm 過於嚴謹又或者說是過於悲觀,才導致實際可行的 schedule 被判斷為不可行。過於 inaccurcy 的 algorithm 也被認為是效能差,因為實際可以多接受 job 卻因為錯誤的判斷導致少執行到的這些 jobs。 :::info 若基於 periodic task model,擁有精準的 digit control...等 => well accuracy 基於大範圍變動的 processor-time damends 和 release-time jitter => poor accuracy ::: :::success accuracy 和 robust 間存在負相關 : 給定的條件較鬆散 => robust (上升) accuracy (下降) 給定的條件較嚴謹 => robust (下降) accuracy (上升) ::: 若 validation algorithm 可以在此三項效能評比得到平衡,而不是某項高某項低,那就稱其為 ==good validation algorithm==。 --- ## Online vs Offline scheduling ### Off-line scheduling 在系統開始之前,就已經根據 job 的 release time. processor time. resource requirement 做好相對應的計算與分配,這樣產生的 schedule 就稱為 ==off-line schdule==。若系統的 operation mode 改變,那麼就會採用利用新的 mode 去重新計算出的新的 schedule。 * Disadvantages : off-line scheduling 有個很明顯的缺點,即是 ==inflexibility==。主要是因為系統必須要 deterministic,也就是 job 的 demands 都必須是知道的且不能改變 * Advantages : 演算法所需的時間複雜度就變得不是那麼重要,因為計算都是發生在執行之前 ### On-line scheduling job 的相關資訊(parameters)只在 job release 後才得知,也就是說 scheduler 在排程時,並不需要知道 jobs 的 parameter,而是會根據目前遇到的狀況進行排程。 **An acceptance test** : 系統運行中,已經有既定的 jobs 在執行,那若有一個新的 job 要加入系統,會利用一個測試判斷是否會跟既有的 job 產生 conflict,該測試就稱為 **An acceptance test**。 ### Trade-off 在 workload 是 unpredictable 的情況,通常會採用 on-line scheduling,因為上面提到 on-line scheduling 是可以忍受 job demand 與 resource available 的 dynamic variation,不過 on-line scheduling 並無法對系統得到最佳的 resource 分配,因為她並不知道未來的情況 : Eg: non-preemptive $J_1$ release time = 0, execution time = 1, deadline = 2. * 在 time 0 就進行 schedule $J_1$ 在執行期間加入一個 $J_2$ release time = 0.3, execution time = 0.7, deadline = 1,由於 $J_1$ 為 non-preemptive 因此 $J_2$ 一定會 miss deadline,不過如果預先知道 $J_2$ 的情況,就可以預先做到最佳的排程,也就是讓 $J_2$ 先執行,$J_1$ 則在 time == 1 時再開始執行,藉此就不會 miss deadline * 在 0 < time x < 1 就進行 schedule $J_1$ 假設在 x 時,$J_3$ 剛好被 release, execution time = 1, deadline = 2,那麼在 schedule 時就會不知道該先讓 $J_1 or J_3$ 執行,因為一定無法同時 meet deadline 上述兩個例子也就說明,因為對未來的不可預知(job 的 timing constranints 等),所以不管採取怎樣的策略都可能造成後面的 jobs miss deadline。 :::info 只要有 job 為 non-preemptable,on-line scheduling alorithm 就無法得到 optimal 的結果,換句話說,就是說只有當 jobs 皆為 preemptable 且 one processor 的情況下 on-line algorithm 才存在 optimal 如 : EDF. LST。 ::: ### System overloaded 指系統無法照著 schedule 執行。因此無論 schedule 多好只要 system overloaded 發生就無法照著預期的情況運行。而當 overload 發生時,最常使用的方式就是直接丟棄某些 job,藉此可以讓其他 job 在 timing constraint 前完成。至於在發生 overload 的情況下,要如何評量一個 scheduling algorithm 的效能呢?那就是在這樣的情況下來能夠排多少的 work(value of a job),能排越多 work 也就代表該 scheduler 越好。 ```c value_of_job = (job_meet_deadline) ? execution_time : 0 value_of_schedule = sum_of_all_jobs ``` value of schedule 越高,就代表該 scheduler 越好,若該 scheduler 的 value 為 maxmium 的話,又稱該 schedule algorithm 為 optimal。在 system overloaded 的情況下,我們就會使用 maximum possible value 作為 schedule value。 :::info 在 system overload 和沒有 overload 下的 optimal 定義並不相同喔~ ::: ### Competitive factor c c 就代表著 on-line algorithm 的 value of schedule 是 off-line algorithm 的 value of schedule 的多少倍。 $c = \frac{value of schedule(on-line)}{value of schedule(off-line)}$ 因此若是在 `preemptable`. `one processor`. `resource independent`. `system not overload` 的情況下,c = 1; 反之若 system overload, c = 0。 ### Therorem 在 system extremely overload (很嚴重)的情況下,沒有 on-line algorithm 的 competitve factor 可以超過 ==0.25==,即便只是輕微的 overloaded(Slightly overloaded), competitive factor 最多也無法超過 0.385。 因此若要使用 on-line algorithm 最重要的即時維護系統,防止系統發生 system overloaded,也因此若系統一定要接受和處理大量的 jobs,就必須不斷選擇哪些 job 可以丟棄,不斷的丟棄直到系統不會 overload。至於如何選擇要丟棄的 job,不是看 timing parameter 之類的,而是要根據 job 的重要性,又稱 critical factors,這邊的考量因素其實非常多,包含該 job 是否會影響後續的 job 執行或是目前的執行時間。