今回は,T-KernelやμITRONにおけるタスクの「広義の待ち状態」の中で,やや特殊な状態である「強制待ち状態」と「二重待ち状態」に関する例題と,T-Kernelのアラームハンドラに関する例題を取り上げます。例題は,いずれも基礎的な知識で解答できますので,第一区分となります。

例題1 テーマ:強制待ち状態と二重待ち状態

【問題】
T-Kernelにおいて,セマフォXを用いて資源を共有する3つのタスクA(高優先度),B (中優先度),C(低優先度)があるとする。

最初にタスクAが,次にタスクBが,それぞれセマフォXから資源を1つ獲得しようとしたが,すでにタスクCによって資源が使われているために,どちらも待ち状態になったとする。

この状態で,タスクCからタスクAに対して tk_sus_tsk が実行されてタスクAが二重待ち状態になった後に,セマフォXに資源が2つ返却されたとする。

この時の動作として正しいものを次の中から一つ選べ。

【選択肢】
1. タスクAは二重待ち状態のままであり,タスクBは実行状態となる。

2. タスクAは二重待ち状態のままであり,タスクBは待ち状態のままである。

3. タスクAは強制待ち状態となり,タスクBは実行状態となる。

4. タスクAは強制待ち状態となり,タスクBは待ち状態のままである。

正解(マウスでドラッグして文字を反転させてください)= 3

【解説】
 この問題は,自タスクに対する操作によって発生する「待ち状態」と他タスクからの操作によって発生する「強制待ち状態」が重なった場合の動作を問う問題です。T-KernelとμITRONでシステムコールは異なりますが,基本的に同じ処理となります。ここではT-Kernelのシステムコールの場合の解説を行います。

 tk_wai_semなどによって発生する「待ち状態」と,tk_sus_tskによって発生する「強制待ち状態」は直交しており,両方が同時に発生した場合は「二重待ち状態」となります。また,二重待ち状態が発生した場合は,「待ち状態」および,「強制待ち状態」の両方の待ちが解除されない限り,タスクが実行可能状態にならないという点が本問題のポイントです。

 問題文に示された操作を順に行った場合の各タスクの状態などを図1に表します。

図1●問題文に示された操作を順に行った場合の各タスクの状態など
図1●問題文に示された操作を順に行った場合の各タスクの状態など

(1) タスクCがtk_wai_semによって,セマフォXから資源を獲得し,残り資源数が0となる(この時,タスクAとタスクBは何らかの理由で待ち状態となっている)。

(2) タスクAが実行状態になり,tk_wai_semによってセマフォXから資源を1つ獲得しようとするが,資源がないため待ち状態になる。

(3) タスクBが実行状態になり,tk_wai_semによってセマフォXから資源を1つ獲得しようとするが,資源がないため待ち状態になる。

(4) タスクCが実行状態になり,tk_sus_tskによってタスクAを強制待ち状態にする。この時点でタスクAは待ち状態になっているので,結果としてタスクAは二重待ち状態になる。

(5) タスクCがtk_sig_semによってセマフォXに資源を2つ返却する。
※μITRONではsig_semで返却される資源は1つと定義されています。このため,μITRONではsig_semを2回発行する必要があるなど,若干動作が異なりますが,本例題の動作として大きな違いはありません。

(6) セマフォXに資源が返却されたため,タスクAの(2)のtk_wai_semによる待ち条件が解除される。しかし,タスクAは(4)のtk_sus_tskによって二重待ち状態になっているため,tk_wai_semによる待ち条件が解除されても実行可能状態にはならず,強制待ち状態になる。この時,(2)のtk_wai_semによる資源獲得は成功するため,セマフォXが管理する資源数は1つ減る。

(7) セマフォXには資源が1つ残っているため,タスクBの(3)のtk_wai_semによる待ち条件が解除され,タスクBが実行可能状態になる。

 上記の結果,最終的にタスクAは強制待ち状態,タスクBは実行状態,タスクCは待ち状態となります。したがって,選択肢3が正解となります。

---

 T-Kernelのタスク状態は,大きく以下の5つに分類されます。

  • 実行状態
  • 実行可能状態
  • 広義の待ち状態
  • 休止状態
  • 未登録状態

 このうち,そのタスクを実行できる条件が整わないために実行ができない状態,言い換えると,何らかの条件が満たされるのを待っている状態を「広義の待ち状態」といい,さらに以下の3種類に分類されます。

  • 待ち状態
    何らかの条件が整うまで自タスクの実行を中断するシステムコールが呼び出されたことにより,実行が中断された状態。
  • 強制待ち状態
    他のタスクによって,強制的に実行を中断させられた状態。
  • 二重待ち状態
    待ち状態と強制待ち状態が重なった状態。

 「待ち状態」と「強制待ち状態」はそれぞれを独立しています。タスクの「待ち状態」の解除はタスクの「強制待ち状態」に影響を与えませんし,その逆も然りです。この2種類を混同しないようにプログラムを開発する必要があります。