応用情報技術者 2010年 春期 午後 問07
タクシーの料金メータの設計に関する次の記述を読んで、設問1〜3に答えよ。
S社は、タクシーの料金メータ(以下、タクシーメータという)を開発している。S社では、ソフトウェアの品質向上を図るために、設計後のレビューを強化することにした。実施したレビューにおいて、タクシーメータのソフトウェアで不具合が見つかった。
〔ソフトウェア構成〕
タクシーメータは、リアルタイム OS(以下、RTOS という)を使用している。RTOS 上では、表示タスク、料金計算タスク、操作パネルタスク、走行距離通知タスク及び RTOS のタイマタスクが動作する。これらのタスク実行中は、特に指定がない限り、すべての割込みが許可されている。
タクシーメータは、タイマ割込み及び操作パネル割込みを使用している。これらの割込みは、タイマ割込みハンドラ及び操作パネルハンドラで処理される。各ハンドラは、それぞれタイマタスク及び操作パネルタスクを起動する。
タクシーメータのタスク一覧を表に示す。


〔RTOSの仕様(一部)〕
(1) タスクは、優先度によって実行が決定される。優先度は変更することができる。
(2) タスク同期制御にイベントフラグを使用する。イベントフラグの操作にはセット及びクリアがある。
(3) タスクはイベントフラグのセット待ち要求を行うと、イベントフラグがセットされるまで待ち状態となる。既にイベントフラグがセットされている場合は、セット待ち要求を行っても、待ち状態にはならない。
セット待ち要求では、タイムアウトの設定ができる。タイムアウトになると、指定時間内にイベントフラグがセットされなくても、待ち状態が解除される。
(4) タスクごとに、特定又はすべての割込みに対して、割込み禁止及び割込み許可を指定できる。
〔タクシーメータの仕様〕
操作パネルで “賃走” を指定すると、最初に “メートル走行するまで” 又は “秒経過するまで” 料金は円である。これを初乗りという。
初乗りの条件を過ぎると、“メートル走行する” 又は “秒経過する” ごとに、料金が円ずつ加算される。、、、、、及びは特殊な装置によって設定可能である。
料金の計算は、操作パネルで “支払い” ボタンが押されるまで続けられる。
〔料金計算タスク〕
料金計算タスクの処理の流れを図に示す。料金計算タスクは、初乗りから “支払い” ボタンが押されるまでの間、図の②〜⑦の処理を続ける。


〔不具合の指摘〕
レビューを実施したところ、次の二つの指摘があった。
(1) イベントフラグのセット待ち方法の不具合とその対策
料金計算タスクにおいて、イベントフラグのセット待ちを要求しても、待ち状態にならないことがある。その結果、表示金額の計算が過大となってしまう。
この不具合は、a の直後に、b が起きると発生する。
a によって c が解除され、料金計算タスクは実行状態となり、イベントフラグを d する。この直後に b があると、イベントフラグがセットされてしまい、次のイベントフラグのセット待ちで待ち状態にならない。
この不具合は、図中の e と ⑤ とを入れ替えることで回避できる。
(2) 操作パネル割込み制御の不具合とその対策
図中の処理⑦では、表示タスク通知処理の開始から終了までの間、操作パネル割込みは禁止されているので、操作パネル割込みは実行されないはずである。しかし、次のような場合に、操作パネル割込みを実行してしまう。
操作パネル割込みを禁止した直後に f が発生すると、f ハンドラによって g が起動され、料金計算タスクは処理が中断される。
起動されたタスクは、操作パネル割込みを許可しているので、h が発生すると受け付けてしまう。
現在の処理を大きく変更せずにこの不具合を回避するには、表示タスク通知処理実行中は、タスクの優先度をタイマタスクの優先度と同じにするか、又は表示タスク通知処理を行う間は、すべての割込みを禁止すればよい。
設問1:イベントフラグのセット待ち方法の不具合について、(1)、(2)に答えよ。ただし、表示タスク通知処理では、ほかのタスクを起動することはないものとする。
(1)本文中のa〜dに入れる適切な字句を答えよ。
模範解答
a:タイムアウト
b:走行通知
c:イベントフラグのセット待ち又は待ち状態
d:クリア
解説
解答の論理構成
- RTOS 仕様(3)には
“タスクはイベントフラグのセット待ち要求を行うと、イベントフラグがセットされるまで待ち状態となる。…タイムアウトになると、指定時間内にイベントフラグがセットされなくても、待ち状態が解除される。”
とあります。待ち状態から復帰させる契機は “イベントフラグがセットされた場合” と “タイムアウト” の2通りです。 - 問題文の指摘では
“この不具合は、a の直後に、b が起きると発生する。”
とあります。イベントフラグがセットされないまま待ち状態が解除される典型的な原因は “タイムアウト” です。よって [a]=“タイムアウト”。 - “走行距離通知タスクがイベントフラグをセットする” ことを問題文は “走行通知” と呼んでいます。したがって [b]=“走行通知”。
- “a によって c が解除され…イベントフラグを d する。”
・[a] が “タイムアウト” なら、解除されるのは “イベントフラグのセット待ち又は待ち状態” そのものです。
・待ちから復帰した直後にタスクが行う操作は、フラグをリセットして次回に備える “クリア” です。
よって [c]=“イベントフラグのセット待ち又は待ち状態”、[d]=“クリア”。 - 以上を整理すると
a:タイムアウト
b:走行通知
c:イベントフラグのセット待ち又は待ち状態
d:クリア
が矛盾なく整合します。
誤りやすいポイント
- “走行通知” と “走行通知要求” を取り違える。セットされるのは “走行通知” であって要求ではありません。
- [c] を “タイマタスク” などにしてしまうケース。解除対象は状態であってタスクではありません。
- [d] に “セット” を書いてしまうミス。バグを防ぐために次の待ちの前に行う操作は “クリア” です。
FAQ
Q: なぜフラグをクリアしないと次の待ちで待ち状態にならないのですか?
A: RTOS 仕様(3)に “既にイベントフラグがセットされている場合は、セット待ち要求を行っても、待ち状態にはならない。” と明記されています。クリアしないとフラグはセット済みのままなので、再び待とうとしても即時復帰してしまいます。
A: RTOS 仕様(3)に “既にイベントフラグがセットされている場合は、セット待ち要求を行っても、待ち状態にはならない。” と明記されています。クリアしないとフラグはセット済みのままなので、再び待とうとしても即時復帰してしまいます。
Q: ⑤と [e] を入れ替えるとバグが解消する理由は?
A: 先に “走行通知要求を取り消す”(⑤) ことで、タイムアウト直後に “走行通知” が届く可能性を無くし、その後にフラグをクリアすれば、フラグが再度セットされるタイミングがずれるためです。
A: 先に “走行通知要求を取り消す”(⑤) ことで、タイムアウト直後に “走行通知” が届く可能性を無くし、その後にフラグをクリアすれば、フラグが再度セットされるタイミングがずれるためです。
Q: タイムアウト時間を短くすれば同じ不具合は出ませんか?
A: タイムアウトと走行通知の競合はタイミング依存なので、時間を短くしても偶発的に衝突する可能性は残ります。根本対策として順序の見直しや割込み制御が必要です。
A: タイムアウトと走行通知の競合はタイミング依存なので、時間を短くしても偶発的に衝突する可能性は残ります。根本対策として順序の見直しや割込み制御が必要です。
関連キーワード: イベントフラグ, タイムアウト, 割込み競合, 同期制御, 走行通知
設問1:イベントフラグのセット待ち方法の不具合について、(1)、(2)に答えよ。ただし、表示タスク通知処理では、ほかのタスクを起動することはないものとする。
(2)本文中のeに入れる、図中の処理の番号を答えよ。
模範解答
e:④
解説
解答の論理構成
- 問題文では、イベントフラグのセット待ちが解除された直後に再びイベントフラグがセットされると、次の待ちで待ち状態にならず「表示金額の計算が過大」となる不具合が説明されています。
引用:「この不具合は、図中の e と ⑤ とを入れ替えることで回避できる。」 - 原因は、料金計算タスクが待ち解除後すぐにイベントフラグをクリア(図中のある処理)し、その後に走行距離通知タスクからイベントフラグがセットされるまでの「すき間」が発生する点にあります。
- 不具合を回避するためには、まず“走行通知要求”を取り消してイベントフラグの再セットを防ぎ、それからイベントフラグをクリアする必要があります。
- したがって、入れ替え対象となる e は「イベントフラグをクリアする処理」に相当する図中の番号であり、問題文の指定通り「④」が該当します。
- よって解答は
e :④
誤りやすいポイント
- 「イベントフラグのクリア=安全」と思い込み、クリアのタイミングを意識しないまま手順を覚えてしまうと、本問のような競合条件を見落としやすいです。
- 「タイムアウトで待ち解除された場合には不具合が起きない」と早合点し、走行距離通知タスク側でフラグがセットされるケースを想定しないと失点します。
- ④と⑤を単に「順序が逆でも同じ」と誤解し、処理相互の依存(クリア→即セットでフラグが残る)を理解しないミスが頻発します。
FAQ
Q: なぜクリアよりも先に“走行通知要求”を取り消す必要があるのですか?
A: 取り消しを先に行わないと、クリア直後に走行距離通知タスクがフラグを再セットし、次回の待ちで待ち状態に入れなくなるためです。
A: 取り消しを先に行わないと、クリア直後に走行距離通知タスクがフラグを再セットし、次回の待ちで待ち状態に入れなくなるためです。
Q: イベントフラグのクリアを複数回行ってはいけないのですか?
A: クリアそのものは複数回行っても問題ありませんが、「セットされる可能性がある処理」が残っている状態でクリアしても競合を解消できません。
A: クリアそのものは複数回行っても問題ありませんが、「セットされる可能性がある処理」が残っている状態でクリアしても競合を解消できません。
Q: タイムアウト値を短くすれば不具合は回避できますか?
A: タイムアウトは待ち解除条件の一つに過ぎず、根本的な競合は残ります。順序を正しくするか、排他制御を追加しなければ再発します。
A: タイムアウトは待ち解除条件の一つに過ぎず、根本的な競合は残ります。順序を正しくするか、排他制御を追加しなければ再発します。
関連キーワード: イベントフラグ, タイムアウト, 割込み制御, タスク優先度, 排他制御
設問2:
操作パネル割込み制御の不具合について、f〜hに入れる適切な字句を答えよ。
模範解答
f:タイマ割込み
g:タイマタスク
h:操作パネル割込み
解説
解答の論理構成
-
状況整理
【問題文】には
“図中の処理⑦では、表示タスク通知処理の開始から終了までの間、操作パネル割込みは禁止されている”
とあります。したがって料金計算タスクが⑦を実行中は、通常なら操作パネル割込みは入って来ません。 -
それでも割込みが入る理由を追跡
引き続き【問題文】には
“操作パネル割込みを禁止した直後に f が発生すると、f ハンドラによって g が起動され、料金計算タスクは処理が中断される。”
と記されています。
⑦で禁止しているのは“操作パネル割込み”だけで、他の割込みは許可したままです。タクシーメータが利用している他の割込みは “タイマ割込み” です。したがって f に当てはまるのは
→ 「タイマ割込み」。 -
ハンドラが起動するタスクを特定
【ソフトウェア構成】には
“タイマ割込みハンドラ…各ハンドラは、それぞれタイマタスク…を起動する。”
と明言されています。よって g は
→ 「タイマタスク」。 -
割込み再許可による再侵入
“起動されたタスクは、操作パネル割込みを許可しているので、h が発生すると受け付けてしまう。”
と続きます。タイマタスクは操作パネル割込みを禁止していないため、走行中に実際の“操作パネル割込み”が来れば受け付けます。よって h は
→ 「操作パネル割込み」。 -
以上より
f:タイマ割込み
g:タイマタスク
h:操作パネル割込み
誤りやすいポイント
- ⑦で禁止しているのは“操作パネル割込み”だけであり、“すべての割込み”ではない点を見落としやすい。
- “タイマ割込みハンドラ”が直接動くと勘違いし、g に“タイマ割込みハンドラ”と書いてしまうケースが多い。実際にRTOS上で新たに走るのは“タイマタスク”。
- 起動タスクが割込み許可状態にあるため再び割込みが入る、という多重割込みの流れをイメージできないと h を“タイマ割込み”と誤回答しやすい。
FAQ
Q: なぜ“タイマ割込み”だけが候補になるのですか?
A: タクシーメータが使用している割込みは【ソフトウェア構成】にある “タイマ割込み及び操作パネル割込み” の2種類だけです。⑦で後者を禁止しているため、残る前者が f となります。
A: タクシーメータが使用している割込みは【ソフトウェア構成】にある “タイマ割込み及び操作パネル割込み” の2種類だけです。⑦で後者を禁止しているため、残る前者が f となります。
Q: “タイマタスク”は高優先度ですが、料金計算タスクより本当に先に実行されますか?
A: はい。【タスク一覧】で “タイマタスク” の優先度は“高”、料金計算タスクは“中”です。RTOS仕様(1) “タスクは、優先度によって実行が決定される。” に従い、割込み後はタイマタスクが先に動きます。
A: はい。【タスク一覧】で “タイマタスク” の優先度は“高”、料金計算タスクは“中”です。RTOS仕様(1) “タスクは、優先度によって実行が決定される。” に従い、割込み後はタイマタスクが先に動きます。
Q: この不具合を根本的に防ぐにはどうすれば良いですか?
A: 【問題文】が示す対策は2案です。⑦の実行区間だけ料金計算タスクの優先度を “タイマタスク” と同じ“高”に上げるか、あるいは “すべての割込みを禁止” してしまう方法です。
A: 【問題文】が示す対策は2案です。⑦の実行区間だけ料金計算タスクの優先度を “タイマタスク” と同じ“高”に上げるか、あるいは “すべての割込みを禁止” してしまう方法です。
関連キーワード: 割込み制御, 優先度逆転, プリエンプティブスケジューリング, イベントフラグ
設問3:
操作パネル割込み制御の不具合とその対策で示したように対処する場合、表示タスク通知処理の実行時間をできるだけ短くしなければならない。その理由を30字以内で述べよ。
模範解答
タイマタスクの実行が遅れないようにするため
解説
解答の論理構成
-
不具合の対策として提示された方法
- 【問題文】「表示タスク通知処理実行中は、タスクの優先度をタイマタスクの優先度と同じにするか、又は表示タスク通知処理を行う間は、すべての割込みを禁止すればよい。」
この対策は、表示タスク通知処理の間に 操作パネル割込み を確実に抑止するためのものです。
- 【問題文】「表示タスク通知処理実行中は、タスクの優先度をタイマタスクの優先度と同じにするか、又は表示タスク通知処理を行う間は、すべての割込みを禁止すればよい。」
-
対策が持つ副作用
- 「すべての割込みを禁止」すると、タイマ割込みも禁止されるため【問題文】「タイマタスク」が起動できなくなります。
- 「タスクの優先度をタイマタスクの優先度と同じ」にする場合も、先に動作を開始した表示タスク通知処理が実行を占有する限り、同優先度の タイマタスク はスケジューラから実行を分けてもらえません。
-
タイマタスクが遅れると何が起こるか
- 【ソフトウェア構成】にある「タイマタスク」は「時間に関する処理」を担当します。
- 料金計算タスク③のタイムアウト判定や、走行距離通知タスクの内部タイマなど、システム全体の時間管理が遅延し、料金計算そのものが狂う恐れがあります。
-
結論
表示タスク通知処理で割込み禁止または高優先度化を行う時間は短いほど、タイマタスク の実行遅延を最小化できます。
したがって解答は「タイマタスクの実行が遅れないようにするため」となります。
誤りやすいポイント
- 操作パネル割込みだけを意識し、他の割込み(タイマ割込み)の影響を見落としてしまう。
- 「同じ優先度ならプリエンプトされる」と思い込み、実際には同優先度ではラウンドロビが行われない RTOS も多い点を忘れる。
- 「割込み禁止=安全」と短絡的に考え、リアルタイム性の低下を評価しない。
FAQ
Q: すべての割込みを禁止する方法がもっとも確実では?
A: 確実ですが、【問題文】「タイマタスク」のように時間厳守が必要な処理まで止まります。リアルタイム OS では禁止区間は最小化するのが原則です。
A: 確実ですが、【問題文】「タイマタスク」のように時間厳守が必要な処理まで止まります。リアルタイム OS では禁止区間は最小化するのが原則です。
Q: 「タスクの優先度をタイマタスクと同じ」にした場合、タイマタスクは全く動けませんか。
A: 同期方法がラウンドロビであれば動けますが、一般的な優先度ベースの RTOS では「先に実行権を得たタスクが終了するまで」同優先度タスクへ実行が回らない実装も多く、遅延が起こり得ます。
A: 同期方法がラウンドロビであれば動けますが、一般的な優先度ベースの RTOS では「先に実行権を得たタスクが終了するまで」同優先度タスクへ実行が回らない実装も多く、遅延が起こり得ます。
Q: 他に対策はないのですか。
A: 表示タスク通知処理をクリティカルセクション化し、割込み禁止ではなくミューテックスで保護する方法もありますが、問題文では「現在の処理を大きく変更せずに」と明示されているため採用していません。
A: 表示タスク通知処理をクリティカルセクション化し、割込み禁止ではなくミューテックスで保護する方法もありますが、問題文では「現在の処理を大きく変更せずに」と明示されているため採用していません。
関連キーワード: 割込み禁止, 優先度制御, リアルタイムOS, イベントフラグ


