ETECクラス2の技術要素に関する演習を解きながら、基礎を解説してきた本連載も最終回。今回はタスクの状態遷移について。
前回の宿題【問題11】は、「タスクの状態遷移」に関する問題でした。
「タスク」は、生成されてから削除されるまでいくつかの状態に遷移します。リアルタイムOSでは、優先度ベースの「プリエンプション方式」のタスクスケジューリングを採用しており、常に最も高い優先度のタスクが実行状態になります。
今回も問題の解答に続いて、タスクの状態遷移と優先度について解説します。この機会にしっかりと理解しておきましょう。
それでは、解答を発表します!
問題11 次のうち、タスクの状態遷移に関する記述として、正しいものはどれか? 答え. ア (←クリック) |
ア以外の記述には、誤りがあります。
イは「待ち状態に遷移する」が誤りです。現在実行状態にあるタスクは、自分よりも優先度の高いタスクが実行可能状態になると、実行可能状態に遷移します。ウは「実行可能状態に遷移する」が誤りです。現在実行状態にあるタスクが実行可能状態に遷移するのは、自分より優先度の高いタスクが実行可能状態になった場合のみです。エは「実行状態に遷移する」が誤りです。待ち状態のタスクは、入出力の完了など、待ち状態が解除されるイベントがあると実行可能状態に遷移します。
タスクは、ソフトウェアで処理を実行する最小単位です。複数のタスクを切り替えながら実行していくことで、ソフトウェアのさまざまな機能を実現します。ただし、タスクの処理は、いきなり実行されるわけではありません。タスクは、次に示すように、生成されてから削除されるまで、いくつかの状態に遷移します(表1)(図1)。
タスクの状態 |
説明 |
遷移 |
未生成状態 |
タスクが生成されていない、あるいは削除されており、システムにおいてタスクが認識されていない状態 | ・タスク生成のシステムコール→休止状態 |
休止状態 (Dormant) |
タスクが起動されていない、あるいは実行を終了した状態 | ・タスク起動のシステムコール→実行可能状態 ・タスク削除のシステムコール→未生成状態 |
実行可能状態 (Ready) |
実行の準備が整い、ディスパッチを待っている状態 | ・ディスパッチ→実行状態 |
実行状態 (Run) |
実際に処理が実行されている状態 | ・プリエンプション→実行可能状態 ・タスク終了のシステムコール→休止状態 |
待ち状態 (Wait) |
入出力の完了、タイマによる待機など、処理の実行に必要な条件が整うまで待機している状態 | ・待ち解除の条件が満たされた場合→実行可能状態 |
図1 タスクの状態遷移 |
MPUコアが1つのマルチタスク環境では、実行状態のタスクは常に1つです。次に実行するタスクを決めることをタスクの「スケジューリング」、タスクを実行状態に遷移させることをタスクの「ディスパッチ」といいます。そして、タスクのスケジューリングとディスパッチを行うソフトウェアを「タスクスケジューラ」といいます。
続いて、主なスケジューリング方式を表2に示します。
方式 |
説明 |
優先度方式 | タスクに優先度を与え、最も優先度の高いタスクを実行する方式 |
到着順方式 | 「FCFS(First Come, First Served)方式」ともいう。起動された(実行可能状態になった)順にタスクを実行する方式 |
ラウンドロビン方式 | 各タスクをあらかじめ決めた一定時間(タイムスライス)だけ実行し、時間内に処理が終了しなければ実行を中断して、タスクの待ち行列の末尾にそのタスクを置く方式 |
最短処理時間方式 | 予想処理時間が短い順にタスクを実行する方式 |
また、条件が満たされた場合(より優先度の高いタスクが実行可能状態になった場合など)、現在実行中のタスクを中断して実行可能状態に遷移させ、新たにタスクのディスパッチを行う方式を「プリエンプション方式」といいます。現在実行中のタスクの処理が終了するまでディスパッチが発生しない方式を「ノンプリエンプション方式」といいます。
組み込みシステムでは、処理のリアルタイム性を確保することが求められます。そのため、リアルタイムOSでは、一般的に優先度をベースとしたプリエンプション方式のタスクスケジューリングを行います。
優先度ベースのプリエンプション方式では、実行可能状態にある複数のタスクの中で最も優先度の高いタスクがディスパッチされ、実行状態に遷移します。現在実行中のタスクより優先度の高いタスクが実行可能状態になると、現在実行中のタスクが実行可能状態に遷移し(これをプリエンプションという)、優先度の高いタスクがディスパッチされます。つまり、常に最も高い優先度のタスクが実行状態にあるということです。
なお、タスクの優先度が同じ場合には、通常「到着順方式」が適用されます。現在実行中のタスクと同じ優先度のタスクが実行可能状態になった場合、プリエンプションは行われません。
タスクスケジューラは、「TCB(Task Control Block)」の情報を基にタスクを制御します。TCBには、タスクのスケジューリングに必要な情報として、タスク番号、タスクの優先度、タスクの現在の状態、タスクの開始アドレスやスタック領域のアドレスなどが格納されます。タスクの生成時にそのタスク用にTCBが生成され、タスクの起動時にそのTCBが「レディキュー(実行待ち行列)」に配置されます。
例えば、優先度を高い順に1、2、3……とする場合、優先度1のタスクAが実行状態のとき、レディキューには優先度順にタスクのTCBが配置されます。優先度が同じ場合は、起動順(実行可能状態になった順)です。タスクAが入出力の完了などを待機するために待ち状態に遷移した場合、レディキューの先頭にあるタスクBが実行状態に遷移します。タスクAの待ち状態が解除され、再度実行可能状態に遷移したときには、レディキューにおいて同じ優先度のタスクの末尾に配置されます(図2)。
図2 リアルタイムOSにおけるタスクスケジューリングの例 |
優先度ベースのプリエンプション方式のタスクスケジューリングでは、常に最も優先度の高いタスクが実行されます。そのため、組み込みシステムでは、ハードリアルタイム性が求められる処理を実行するタスクに高い優先度を設定し、ほかの処理に中断されず、かつ厳しい制限時間内に処理を完了するようにしなければなりません。
また、割り込み処理にも注意する必要があります。割り込みハンドラは、通常タスクより優先度が高くなるため、割り込み処理が多い場合には、タスクが実行状態になりません。さらに、割り込みハンドラから優先度の高いタスクを生成して起動しても、割り込みハンドラが終了するまでそのタスクは実行可能状態に遷移しません。
組み込みシステムでは、タスクで実行する処理の内容とその優先度、割り込みとの関係をよく検討し、タスク分割と優先度の設定を行う必要があります。
本連載は以上で終了です。これまでに、ETECクラス2の出題範囲の技術要素に該当する演習問題を解きながら、「エンジニアなら知っておきたい基礎のキソ」を解説してきました。しかし、連載第1回で紹介したETECクラス2試験の出題範囲を見て分かるとおり、本連載で解説した範囲はその半分ほどです。「えーっ。覚えることが多過ぎるよ!」と思う方もいるかもしれませんが、ここであきらめないでください。少しずつでも前に進もうという気持ちが何より大切です。
実は現在、新しい連載を企画しています。新連載では、技術要素のスキル項目をいくつか解説した後、組み込みシステム開発で求められる開発技術や管理技術の基本を紹介する予定です。技術的な知識だけではなく、どのように組み込みソフトウェアを開発していくのかを学習していきましょう。(新連載に続く)
関連リンク: | |
組込みソフトウェア技術研修講座イーラーニング(サンプルIDプレゼント中) http://www.certpro.jp/elearning.html |
|
組込みソフトウェア技術者試験クラス2試験対策問題集(ETEC-SW2)(サンプルIDプレゼント中) http://www.certpro.jp/etecsw2test.html |
|
Copyright © ITmedia, Inc. All Rights Reserved.