第14章 スケジューリング機能
本章では,RI600V4が提供しているスケジューリング機能について解説しています。
RI600V4におけるスケジューリング機能では,動的に変化していくタスクの状態を直接参照することにより,タスクの実行順序を管理/決定し,最適なタスクにCPUの利用権を与える機能を提供しています。
アプリケーションは,以下の処理単位によって実行制御されます。
1 ) 割り込みハンドラ,周期ハンドラ,アラーム・ハンドラ
なお,スケジューラとは,実行するタスクを特定し,切り換えるRI600V4の処理のことです。
割り込みハンドラは,割り込み優先レベルが高いほど優先順位が高くなります。
周期ハンドラおよびアラーム・ハンドラの優先順位は,基本クロック割り込みの優先レベルの割り込みハンドラと同じです。
タスク間の優先順位は,タスクに付与された現在優先度に従います。
RI600V4では,スケジューラの駆動方式として何らかの事象(きっかけ)が発生した際に起動する“
事象駆動方式”を採用しています。
RI600V4における事象駆動方式では,以下に示した事象が発生した場合にスケジューラを起動し,タスクのスケジューリング処理を実行します。
- タスクの状態遷移を引き起こす可能性があるサービス・コールの発行
- 非タスク(周期ハンドラ,割り込みハンドラなど)からの復帰命令の発行
-
時間管理機能を行う際に使用している基本クロック用タイマ割り込みの発生
RI600V4では,タスクのスケジューリング方式として各タスクに定義されている優先度を利用した“
優先度方式”,および,RI600V4のスケジューリング対象となってからの経過時間を利用した“
FCFS方式”を採用しています。
RI600V4における優先度方式では,実行可能な状態(RUNNING状態またはREADY状態)にある全タスクの中から“最も高い現在優先度を持つタスク”を選び出し,CPUの利用権を与えます。
“最も高い現在優先度を持つタスク”が複数存在する場合は,優先度方式だけではスケジューリング対象のタスクを決定することができません。この場合,RI600V4はFCFS方式(First Come First Served方式)でスケジューリング対象のタスクを決定します。具体的は,それらのの中で最も早く実行可能な状態(READY状態)へ遷移したタスクを選び出し,CPUの利用権を与えます。
RI600V4では,タスクのスケジューリング方式を実現する手段として“レディ・キュー”を提供しています。
なお,RI600V4におけるレディ・キューは,優先度をキーとしたハッシュ・テーブルであり,実行可能な状態(RUNNING状態またはREADY状態)へと遷移したタスクがFIFO順でキューイングされます。このため,スケジューラは,起動された際にレディ・キューの優先度高位から検出処理を実行し,キューイングされているタスクを検出した場合には,該当優先度の先頭タスクにCPUの利用権を与えることにより,RI600V4のスケジューリング方式(優先度方式,FCFS方式)を実現しています。
以下に,複数のタスクがレディ・キューにキューイングされている場合を示します。
図14−1 スケジューリング方式(優先度方式,FCFS方式)の実現
- レディ・キューの生成
RI600V4では,レディ・キューの静的な生成のみサポートしています。処理プログラムからサービス・コールを発行して動的に生成することはできません。
レディ・キューの静的生成とは,システム・コンフィギュレーション・ファイルで
システム情報(system)の
タスク優先度の最大値(priority)を定義することをいいます。
RI600V4では,処理プログラムからスケジューラの状態を明示的に操作し,ディスパッチ処理を禁止/許可する機能(スケジューリングのロック機能)を提供しています。
以下に,スケジューリングのロック機能を利用した際の処理の流れを示します。
RUNNING状態またはREADY状態のタスクが存在しなくなると,RI600V4内部で無限ループとなり,割り込みが発生するのを待ちます。
14.7 非タスク内におけるタスク・スケジューリング処理
「
14.2 処理の単位と優先順位」に示したように,非タスク(割り込みハンドラ,周期ハンドラおよびアラーム・ハンドラ)はタスクよりも優先順位が高いため,非タスク処理が始まるとそれが完了するまで,タスクは実行されません。
以下に,非タスク内でディスパッチ処理を伴うサービス・コールを発行した際の例を示します。この例では,割り込みハンドラが事象通知を行った時点でタスクBよりも優先度の高いタスクAの待ち状態が解除されますが,この時点ではタスクAはまだ実行されず,非タスク(割り込みハンドラ)の処理が継続されます。非タスク処理が完了した時点でスケジューラが起動され,その結果タスクAが実行されます。
図14−3 非タスク内におけるスケジューリング処理