調度程式的功能是決定什麼時候開始運行、什麼時間或什麼情況下讓給其他程式運行。調度程式可以處於後台,也可以處於前台。處於後台的調度程式即為後台調度程式。如果處於後台部分,程式比較簡單,但後台調度程式比前台調度程式適用範圍窄。
基本介紹
- 中文名:後台調度程式
- 外文名:background scheduler
- 所屬學科:計算機
- 所屬範圍:嵌入式程式
- 優點:容易編程、與硬體的互動作用少
- 限制:所有後台任務有相同的優先權
簡介,調度程式的數據結構,調度程式,優點,
簡介
一個後台的運行任務可能由於外部中斷停止運行,中斷使前台任務運行。當前台任務完成後,後台任務從中斷處恢復運行。如果調度程式是後台的一部分,那么在當前正在運行的後台任務完成前,調度程式都不能運行。調度程式調度後台任務運行,任務完成後,再把控制權返回給調度程式,這時調度程式檢查任務佇列,看佇列中是否有就緒任務。如果有,首先設定計時器,然後激活運行佇列中的第一個任務。如果沒有,調度程式則不斷循環檢測計時器,一直等到有一個就緒任務運行。調度程式也可能調用一個“閒散”任務,這是一個沒有其他事情做時才運行的任務。例如閒散任務可以用來檢測前述程式中的stop信號,或者用來與操作台互動作用等等。採用這種調度方法時,不得不對上述程式做一些改動。
task1一id—task—create(&function1,&data 1,tsample 1,run—continuous)
task2一id—task—create(&function2,&data2,tsample2,run—continuous)
task3一id—task—create(&stop—check,&data3,0,deep—background)
enter--task-queue(task1--id)
enter--task--queue(task2--id)
enter--task--queue(task3--id)
上述程式中的deep—background即表示閒散任務。因為調度程式也是後台的一部分,使任務進入作業佇列還沒有開始運行,只有顯式地套用調度程式才會使它運行。這樣一旦調度程式開始,程式可能將不再返回主程式段,一直到系統結束。因此如果有一個閒散任務,調度程式必須知道閒散任務的作用和功能。因為一有空閒,閒散任務就要運行,所以採樣時間表示為零。
調度程式的數據結構
任務描述子的模組結構
指向函式的指針task--function
指向結構的指針 task—data
整型量task--type
整型量task-state
浮點型(或整型) sample--time
浮點型(或整型) time—left
指向結構的指針 next-task
每次創建一個新任務,給任務描述子分配記憶體;當任務移出之後,釋放分配的空間。任務之間由描述子內的連結指針next—task連結。task—type規定任務類型。任務狀態task—state用來跟蹤任務的行為。當任務創建時,並不激活;任務進入作業佇列後,或者處於激活狀態,或者處於不激活狀態。採樣時間由sample—time給出,剩餘時間time--left則指出到下個任務開始運行還剩多少時間。
任務連結指針的工作情況。其中A,B,C的採樣時間分別為50ms,70ms,40ms,假設系統啟動時C任務運行。
當前運行任務完成後,調度程式讓它的剩餘時間time—Ieft恢復等於它的採樣時間。同時檢查任務佇列,把這個任務放到正確的位置,重新排序佇列,調整連結指針。例如C任務完成後不是插在B任務後面而是插在B任務前面,因此打斷了A任務到B任務的連結。
另外有一個保存不激活任務的佇列,如果允許有一個以上的閒散任務,則還要增加一個閒散任務佇列。因為所有任務描述子,即任務結點,由指針連結,只需要改變指針,就能重排佇列。
調度程式
current—task=head—of—queue
設定計時器current—task—time—left
不斷循環
一直重複到時間結束
執行閒散任務
執行current-task→task-function(current-task→task-data)
If(current-task→task-type=run-conlinuous)
current-task→last-time=current-task→sample-time
把當前任務移到佇列中的正確位置
Else
把當前任務移到不激活佇列
If (任務佇列不空)
current-task=head-of-queue
設定計時器current-task→time-left
Else
關斷計時器
其中的當前任務由描述子結構表示。
優點
後台調度程式的優點是容易編程和與硬體的互動作用少,但後台調度也受到一些限制。這主要是由於一個後台任務一旦開始,直到它完成以前其他後台任務不能運行,為此所有後台任務實際上有相同的優先權。一個任務具有高優先權表示當到達它的運行時間,它能夠中斷正在運行的任意較低優先權的任務。如果用後台調度,高優先權任務也不能中斷低優先權任務。
另一個限制是採樣周期長的任務,其執行時間應比最短的採樣間隔短。如果不是這樣,採樣周期短的任務的實際間隔將很不穩定。因為只要CPU有空閒時間,閒散任務就開始運行,所以要防止閒散任務和下一個運行任務的衝突,讓任務的運行比調度稍慢一點。如果閒散任務很快,衝突少,這樣可以更充分地利用CPU資源。為了解決衝突問題,最簡單的辦法是在每次循環調度中只運行一次閒散任務。這樣對採樣周期長的程式很適用,但CPU時間的利用率不高。較複雜的辦法是設法檢查計時器的剩餘時間,如果剩餘時間多,就運行閒散任務。這意味著計時程式要返回當前運行周期的剩餘時間,或者用戶必須向調度程式傳送閒散任務該運行多長時間的信息,調度程式通過檢查計時獲得這些信息。
如果幾個任務運行時間相近,優先權相同,後台調度是有用的。如果CPU的全部負載適度,任務將順利地循環運行。如果任務間的執行時間和或優先權變化範圍大,調度程式將很難裁決任務間的衝突。如果任務都要占用大片CPU時間,將會經常出現時間衝突,導致不規律的計時。當然對優先權相同的任務,這不是由於後台調度的過失,任何調度方法都會發生這類問題。如果使用小片CPU時間,當採樣周期增長到二倍以上時間片時,仍舊可能有調度衝突。這種衝突是不可避免的,但可以通過適當分解任務把衝突減到最小。