• 検索結果がありません。

タスク状態とスケジューリング規則

ドキュメント内 μITRON4.0仕様書(Ver ) (ページ 68-73)

第 3 章 µITRON4.0仕様の概念と共通定義 49

3.2 タスク状態とスケジューリング規則

3.2.1 タスク状態

タスク状態は,大きく次の5つに分類される.この内,広義の待ち状態は,さ らに3つの状態に分類される.また,実行状態と実行可能状態を総称して,実 行できる状態と呼ぶ.

(a) 実行状態(RUNNING)

現在そのタスクを実行中であるという状態.ただし,非タスクコンテキス トを実行している間は,非タスクコンテキストの実行を開始する前に実行 していたタスクが実行状態であるものとする.

(b)実行可能状態(READY)

そのタスクを実行する準備は整っているが,そのタスクよりも優先順位の 高いタスクが実行中であるために,そのタスクを実行できない状態.言い 換えると,実行できる状態のタスクの中で最高の優先順位になればいつで も実行できる状態.

(c) 広義の待ち状態

そのタスクを実行できる条件が整わないために,実行ができない状態.言 い換えると,何らかの条件が満たされるのを待っている状態.タスクが広 義の待ち状態にある間,プログラムカウンタやレジスタなどのプログラム の実行状態を表現する情報は保存されている.タスクを広義の待ち状態か ら実行再開する時には,プログラムカウンタやレジスタなどを広義の待ち 状態になる直前の値に戻す.広義の待ち状態は,さらに次の3つの状態に分 類される.

(c.1) 待ち状態(WAITING)

何らかの条件が整うまで自タスクの実行を中断するサービスコールを呼び 出したことにより,実行が中断された状態.

(c.2)強制待ち状態(SUSPENDED)

他 の タ ス ク に よ っ て,強 制 的 に 実 行 を 中 断 さ せ ら れ た 状 態.た だ し

µITRON4.0仕様では,自タスクを強制待ち状態にすることもできる.

(c.3)二重待ち状態(WAITING-SUSPENDED)

待ち状態と強制待ち状態が重なった状態.待ち状態にあるタスクに対して,

強制待ち状態への移行が要求されると,二重待ち状態に移行させる.

(d)休止状態(DORMANT)

タスクがまだ起動されていないか,実行を終了した後の状態.タスクが休 止状態にある間は,実行状態を表現する情報は保存されていない.タスク を休止状態から起動する時には,タスクの起動番地から実行を開始する.ま た,レジスタの内容は保証されない.

(e)未登録状態(NON-EXISTENT)

タスクがまだ生成されていないか,削除された後の,システムに登録され ていない仮想的な状態.

実装によっては,以上のいずれにも分類されない過渡的な状態が存在する場合 がある(3.5.6節参照).

実行可能状態に移行したタスクが,現在実行中のタスクよりも高い優先順位を 持つ場合には,実行可能状態への移行と同時にディスパッチが起こり,即座に 実行状態へ移行する場合がある.この場合,それまで実行状態であったタスク は,新たに実行状態へ移行したタスクにプリエンプトされたという.また,

サービスコールの機能説明などで,「実行可能状態に移行させる」と記述され ている場合でも,タスクの優先順位によっては,即座に実行状態に移行させる 場合もある.

タスクの起動とは,休止状態のタスクを実行可能状態に移行させることをい う.このことから,休止状態と未登録状態以外の状態を総称して,起動された 状態と呼ぶことがある.タスクの終了とは,起動された状態のタスクを休止状 態に移行させることをいう.

タスクの待ち解除とは,タスクが待ち状態の時は実行可能状態に,二重待ち状 態の時は強制待ち状態に移行させることをいう.また,タスクの強制待ちから の再開とは,タスクが強制待ち状態の時は実行可能状態に,二重待ち状態の時 は待ち状態に移行させることをいう.

一般的な実装におけるタスクの状態遷移を図3-1に示す.実装によっては,こ の図にない状態遷移を行う場合がある.

【補足説明】

待ち状態と強制待ち状態は直交関係にあり,強制待ち状態への移行の要求は,

タスクの待ち解除条件には影響を与えない.言い換えると,タスクが待ち状態 にあるか二重待ち状態にあるかで,タスクの待ち解除条件は変化しない.その ため,資源獲得のための待ち状態(セマフォ資源の獲得待ち状態やメモリブ ロックの獲得待ち状態など)にあるタスクに強制待ち状態への移行が要求さ

れ,二重待ち状態になった場合にも,強制待ち状態への移行が要求されなかっ た場合と同じ条件で資源の割付け(セマフォ資源やメモリブロックの割付けな ど)が行われる.

【µITRON3.0仕様との相違】

タスク状態の英語名を,形容詞形に統一した.具体的には,実行状態をRUN か らRUNNING に,待 ち 状 態 をWAIT か らWAITING に,強 制 待 ち 状 態 を

SUSPEND か らSUSPENDED に,二 重 待 ち 状 態 をWAIT-SUSPEND か ら

WAITING-SUSPENDEDに変更した.

自タスクを強制待ち状態にすることができることとした.これは,自タスクに よる待ちと他のタスクによる待ちを区別しないAPI(POSIXスレッドやJavaス レッドなどのAPI)のインタフェーサを,µITRON4.0仕様のカーネル上に実装 するのを容易にするためである.

図3-1. タスクの状態遷移 未登録状態

NON-EXISTENT 強制待ち状態

SUSPENDED

休止状態 DORMANT 二重待ち状態

WAITING-SUSPENDED

待ち状態 WAITING 実行可能状態

READY

実行状態 RUNNING 待ち

解除

プリエンプト ディスパッチ

強制待ち

待ち解除

待ち

生成 削除

終了と削除 終了

強制終了 強制終了

起動 再開

強制待ち 強制待ち

再開

【仕様決定の理由】

ITRON仕様において待ち状態(自タスクによる待ち)と強制待ち状態(他のタ スクによる待ち)を区別しているのは,それらが重なる場合があるためであ る.それらが重なった状態を二重待ち状態として区別することで,タスクの状 態遷移が明確になり,サービスコールの理解が容易になる.それに対して,待 ち状態のタスクはサービスコールを呼び出せないため,複数の種類の待ち状態

(例えば,起床待ち状態とセマフォ資源の獲得待ち状態)が重なることはない.

ITRON仕様では,他のタスクによる待ちには一つの種類(強制待ち状態)しか ないため,強制待ち状態が重なった状況を強制待ち要求のネストと扱うこと で,タスクの状態遷移を明確にしている.

3.2.2 タスクのスケジューリング規則

ITRON仕様においては,タスクに与えられた優先度に基づくプリエンプティブ な優先度ベーススケジューリング方式を採用している.同じ優先度を持つタス ク間では,FCFS(First Come First Served)方式によりスケジューリングを行う.

具体的には,タスクのスケジューリング規則はタスク間の優先順位を用いて,

タスク間の優先順位はタスクの優先度によって,それぞれ次のように規定され る.

実行できるタスクが複数ある場合には,その中で最も優先順位の高いタスクが 実行状態となり,他は実行可能状態となる.タスク間の優先順位は,異なる優 先度を持つタスク間では,高い優先度を持つタスクの方が高い優先順位を持 つ.同じ優先度を持つタスク間では,先に実行できる状態(実行状態または実 行可能状態)になったタスクの方が高い優先順位を持つ.ただし,サービス コールの呼出しにより,同じ優先度を持つタスク間の優先順位が変更される場 合がある.

最も高い優先順位を持つタスクが替わった場合には,ただちにディスパッチが 起こり,実行状態のタスクが切り替わる.ただし,ディスパッチが起こらない 状態になっている場合には,実行状態のタスクの切替えは,ディスパッチが起 こる状態となるまで保留される.

【補足説明】

ITRON仕様のスケジューリング規則では,優先順位の高いタスクが実行できる 状態にある限り,それより優先順位の低いタスクは全く実行されない.すなわ ち,最も高い優先順位を持つタスクが待ち状態に入るなどの理由で実行できな い状態とならない限り,他のタスクは全く実行されない.この点で,複数のタ スクを公平に実行しようというTSS(Time Sharing System)のスケジューリン グ方式とは根本的に異なっている.ただし,同じ優先度を持つタスク間の優先 順位は,サービスコールを用いて変更することが可能である.アプリケーショ ンがそのようなサービスコールを用いて,TSSにおける代表的なスケジューリ ング方式であるラウンドロビン方式を実現することができる.

同じ優先度を持つタスク間では,先に実行できる状態(実行状態または実行可 能状態)になったタスクの方が高い優先順位を持つことを,図3-2の例を用い て説明する.図3-2 (a)は,優先度1のタスクA,優先度3のタスクE,優先度2

のタスクB,タスクC,タスクDがこの順序で起動された後のタスク間の優先

順位を示す.この状態では,最も優先順位の高いタスクAが実行状態となって 図3-2. タスク間の優先順位

(a) 最初の状態の優先順位 優先度1

優先度2

優先度3

タスクA タスクB タスクE

タスクC 優先順位

タスクD

(b) タスクBが実行状態になった後の優先順位 優先度2

優先度3

タスクB タスクE

タスクC タスクD 優先順位

優先度2

優先度3

タスクC タスクE

タスクD 優先順位

(c) タスクBが待ち状態になった後の優先順位

優先度2

優先度3

タスクC タスクE

タスクD タスクB 優先順位

(d) タスクBが待ち解除された後の優先順位

ドキュメント内 μITRON4.0仕様書(Ver ) (ページ 68-73)