トロンフォーラム

Chap3:リアルタイムOSのしくみ

1. スケジューラのしくみ

リアルタイムOSの中心的な機能であるスケジューラはどのように実現しているのでしょうか。タスクの実行順の制御を見てみましょう。

OSは一定のルールに則り次に切り替えるべきタスクを選択します。ルールに則って実行の待ち行列をつくることをスケジューリングといいます。OSは実行待ちタスクのスケジューリングを行うスケジューラの機能をOSの核ともいうべきカーネル内に持っています。一般的なタスクのスケジューリング方式を以下に示します。

1. FCFS方式(First Come First Service)

最初に実行待ち状態に入ったタスクから実行します。実行待ちのタスクは、先に待ち状態に入ったタスク順に待ち行列をつくります。

2. 優先度方式

各タスクに優先度を付けておき、優先度の高いものから先に実行します。

特に、時間ごとにタスクを切り替え、順番に実行を繰り返す方式をラウンドロビンといいます。他にデッドラインがもっとも近いタスクからCPUの実行権を割り当てるデッドラインドリブン方式(Deadline Driven Scheduling Algorithm) や、各タスクの処理時間が既知である場合に処理時間の短いものから順にCPUを割り当てるSPT方式 (shortest processing time first)などがあります。

μITRONに代表される組込みOSでは、優先度方式とFCFS方式の併用がされています。優先度の高いタスクが実行され、同じ優先度のタスクはFCFS で実行されます。実行の待ち行列(レディ・キュー READY QUEUEという)にあるタスクを一定時間ごとにループ実行させてラウンドロビン方式で実行させることもできます。

優先度方式

優先度方式

2. スケジューラが起動されるのはいつ?

スケジューラは、タスクやハンドラからOSにサービスをコールするごとに起動されます。このOSに対して行なう要求のことをサービスコールと呼びます。サービスコールが発行されるとOSに制御が移り依頼されたサービスの機能処理を実行した後、スケジューラが次に実行すべきタスクを選択し、タスクの切り替え操作を行います。タスクの実行切り替えをタスクスイッチ、切り替え操作をディスパッチといいます。ディスパッチ後は切り替わったタスクにCPUの実行が移ります。元のタスクが再びディスパッチされた時に継続して実行できるように、必要なデータを保持しておきます。実行再開に必要なデータをコンテキストと呼びます。コンテキスト(context)とは、本来「文脈」を意味します。

スケジューラの起動

スケジューラの起動

サービスコールはOSの機能提供に応じて数が異なります。サービスコールはC言語では関数コールによって呼び出されます。対象とするタスクや待ち時間などを関数の引数としてOSに渡します。

サービスコールの例
  • sta_tsk タスクの起動
  • ext_tsk 自タスクの終了
  • wup_tsk 起床待ちのタスクを起床

3. タスクとハンドラの違い

これまで見てきたように、スケジューリングされディスパッチされる対象はタスクです。タスクはOSによって、起動、中断、再開、終了が行われます。しかし、専用の信号がマイコンに入ると自動的に起動される割込みプログラムはOSが介入しなくとも起動します。言わば、OSの管理外のプログラムです。このプログラムからサービスコールが発行されるとOSに制御が移り、タスク操作が可能となります。割込みからのイベント発生を受け、タスクを操作するときに利用されます。サービスコールを発行するタスク以外の処理プログラムをハンドラと呼びます。割込みからのハンドラを割込みハンドラと呼びます。ハンドラにはその他に一定周期で起動される周期ハンドラ、特定時刻または一定時間後に起動するアラームハンドラなどがあります。

タスクとハンドラの違い

タスクとハンドラの違い

4. タスクの状態遷移

先のスケジューラは実行可能になったタスク群の待ち行列からどのタスクを実行するかを決めています。タスクは実行中のタスクが待ちに入ったり、何らかのイベントが発生して待ちが解除され実行可能状態になったりと状態を動的に遷移しながら動作しています。OSは各タスク毎の状態を管理しています。基本は以下の3状態です。RUNNING状態はREADY状態のタスクの中から選択(ディスパッチ)された実行タスクの状態です。RUNNINGタスクが中断された場合(プリエンプトされた場合)READY状態に遷移します。シングルCPUではRUNNING状態のタスクは常に一つです。READY状態のどのタスクをRUNNINGにするかを決定するルールがスケジューリングです。μITRON では休止状態、二重待ち状態や強制待ち状態など主に6状態を管理できます。

タスクの状態遷移

タスクの状態遷移

5. タスク分割の考え方

タスクはどのような視点で切り分けるかを考えてみましょう。OSのタスクスケジューリングやプリエンプションの動作から、タスクに分ける必要があるパターンを考えてみましょう。

  1. 並列処理から見たタスク分割
    ある時間帯に「~しながら~する」といった並列の処理が存在する場合、それぞれの処理は待ち合わせや時間間隔よって処理が切り替わり、断続的に処理が進みます。このような場合は並列する処理をタスクにしなければなりません。逆に、並列に動作することのない処理をタスクに分ける必要はありません。この場合、 C言語で言うならば関数にしておけばよいのです。どの処理を並列動作させたいかの視点でタスクを分割することが必要です。タスク内の処理は優先度が同じであることも分割の指針になります。
  2. 優先処理から見たタスク分割
    先のスケジューリング方式からわかるように、同じ優先度のタスクではFCFSでタスクが切り替わるため、優先的に実行させたい処理が必ずしも優先されるとは限りません。プリエンプションさせたいタスクが実行中のタスクと同じ優先度ではそのタスクが待ち状態になるまで切り替わりません。言い換えれば、プリエンプションさせたい処理はタスクにし、高い優先度をつけます。また、優先度を分けたい処理はタスクにします。一般に、何らかのシステム異常への緊急処理や高速に処理しなければリアルタイム性を損ねるような処理は最高位の優先度を付け、システムのログをとるような空き時間に処理すればよいものは低い優先度を付けます。最下位の優先度のタスクは他にどのタスクも実行されていない時に実行されるためにアイドルタスクと呼ばれます。何も機能しないループ処理をアイドリング用に置く場合もあります。
優先処理の注意

優先度の低いタスクは如何に重要な処理を実行中であろうと中断される場合があること、また、より高いタスクが実行されている限りは下位のタスクは永久に実行されないことに注意して優先度設定する必要があることに注意してください。

6. OSの機能

OSはスケジューリング以外に多くの機能を提供しています。以下はμITRON Ver4の機能です。

  1. タスク管理 タスクの状態を参照、操作する
    例:タスクの起動/終了
  2. タスク付属同期 タスクの状態を操作してタスク間の同期をとる
    例:起床/起床待ち
  3. 同期・通信 待ち合わせ機構と通信手段
    セマフォ: タスク間の待ち合わせ機構。主に共有資源の待ち合わせに利用
    イベントフラグ : タスク間の待ち合わせ機構。処理の完了などを通知する場合に利用
    メールボックス : タスク間のデータの送受信と待ち合わせ機構。メッセージ通信に利用
  4. メモリプール タスクが必要とするメモリの提供、解放を行う

他にデータキュー、メッセージバッファ、ミューテックス、ランデブ、タスク例外処理、時間管理、割込み管理、システム状態管理、サービスコール管理、システム構成管理の機能があります。これらの機能をシステムに組み込むために個別のサービスコールが用意されています。 μITRON Ver4では165個が用意されています。

7. OSを組み込むことによって生じるマイナス面とOSの性能

  1. OSがメモリ領域を占有する
    OSは実行プログラムの一部としてメモリ領域に組み込まれるために、OS分のメモリサイズを確保する必要があります。OSのメモリサイズはOSの機能をどこまで使用するか、タスクや待ち要因の待ち行列をどれだけ用意するかによって異なります。
  2. OSの内部処理に時間をとられる
    タスクがサービスコールを発行して、OSが処理し必要に応じてタスクを切り替えるには時間を要します。要する機能処理時間は依頼されたサービスに応じて異なります。メールボックスによるタスク間通信のような複雑な処理ほど時間がかかります。スケジューラ処理からディスパッチまでの時間はタスクの切り替えのために必要な時間で、特にこれをタスクスイッチ時間と呼んでいます。
  3. OSが割込みを禁止する
    OSの内部処理中に割込み信号が入って別なプログラムが起動されると困る場合があります。 OSはその処理区間を割込み禁止にする命令をCPUに与え問題を回避しています。 これをOSによる割込み禁止時間と呼びます。

OSが介在することによって生ずるこれらのシステム全体に共通な負担をOSのオーバヘッドといいます。OSの性能はこれらのオーバヘッドを如何に小さくするかにかかっています。OSのカタログにはこれらのデータが性能値として掲載されています。

Return Top