エンベデッドシステムスペシャリスト 2015年 午後1 問02
自動釣銭機に関する次の記述を読んで、設問1~3に答えよ。
B社は、スーパーマーケットなどで利用されている電子レジスタ(以下、レジという)に接続して使う自動釣銭機(以下、釣銭機という)を開発している。釣銭機はレジからの指示で、商品の代金としてお客様から預かった紙幣及び硬貨を入金し、釣銭の金額を紙幣と硬貨に分けて出金する。レジと釣銭機の外観を図1に、釣銭機のシステム構成を図2に、釣銭機のシステム構成要素の概要を表1に、それぞれ示す。釣銭機には、制御部、硬貨を取り扱う硬貨部、紙幣を取り扱う紙幣部、操作部及び表示部がある。


〔釣銭機の主な機能〕
釣銭機の主な機能の概要を表2に示す。
さらに、釣銭機に対しては、レジからの指示による動作中に操作部から指示したり、操作部からの指示による動作中にレジから指示したりすることができる。
〔制御部のソフトウェア構成〕
制御部では、リアルタイムOSを使用する。制御部のタスク構成を図3に、制御部のタスク処理概要を表3に示す。


設問1:釣銭機の仕様について、(1)~(3)に答えよ。
設問1(1)
問題文を見る釣銭出金機能を実行したとき、釣銭機がレジに送信する情報を図4に示す。図4中のa、bに入れる適切な字句を答えよ。


模範解答
a:出金金額
b:五千円紙幣
解説
解答の導き方
図4は、釣銭出金機能のときに釣銭機からレジへ送る情報を示しています。図4では、硬貨や紙幣の金種別枚数に加えて、その前に金額を示す欄があります。
表2の「釣銭出金」には、出金した実際の金種別枚数を受信した後、制御部が金額に変換し、「出金金額とその金種別枚数をレジに送信」するとあります。したがって、金種別枚数の前にあるaは、出金した貨幣の合計額を表す「出金金額」です。レジから指定された釣銭金額そのものではなく、実際に出金した枚数から変換した金額である点がポイントです。
次に、図4の紙幣の欄を見ると、千円紙幣の枚数の後にbの枚数欄があります。表2の「釣銭出金」には、「二千円紙幣と一万円紙幣は、釣銭の紙幣として使用しない」とあります。使用可能な紙幣のうち、釣銭に使えるのは千円紙幣と五千円紙幣です。千円紙幣はすでに図4に記載されているため、残るbは五千円紙幣です。
誤りやすいポイント
- aをレジが指定した釣銭金額と考えないようにします。釣銭機は、実際に出金した金種別枚数を金額に変換してレジに送信します。
- 使用可能な紙幣すべてが釣銭に使えるわけではありません。二千円紙幣と一万円紙幣は釣銭に使用しないため、bには入りません。
- 紙幣の欄は、図4にすでにある千円紙幣の枚数と、釣銭に使えるほかの紙幣の金種を対応させて考えます。
FAQ
Q: 出金金額は、出金前にレジが指定した釣銭金額と同じですか?
A: 必ずしも同じとは限りません。釣銭機は実際に出金した枚数を受け取り、その枚数から出金金額を求めてレジに送信します。
A: 必ずしも同じとは限りません。釣銭機は実際に出金した枚数を受け取り、その枚数から出金金額を求めてレジに送信します。
Q: 五千円紙幣が釣銭に使えると判断できるのはなぜですか?
A: 使用可能な紙幣の中で、二千円紙幣と一万円紙幣を釣銭に使用しないとされており、図4には千円紙幣の欄がすでにあります。そのため、千円紙幣以外に釣銭に使える紙幣は五千円紙幣です。
A: 使用可能な紙幣の中で、二千円紙幣と一万円紙幣を釣銭に使用しないとされており、図4には千円紙幣の欄がすでにあります。そのため、千円紙幣以外に釣銭に使える紙幣は五千円紙幣です。
Q: 紙幣の枚数だけでなく、金額も送信するのはなぜですか?
A: 表2では、実際に出金した金種別枚数と、その枚数から変換した出金金額の両方をレジに送信すると説明されています。
A: 表2では、実際に出金した金種別枚数と、その枚数から変換した出金金額の両方をレジに送信すると説明されています。
関連キーワード: 金種、金額変換、出金処理、データ項目、仕様読解
設問1(2)
問題文を見る次に示す条件の下、シリアルI/F2及びシリアルI/F3の通信速度は、何ビット/秒以上必要か。答えは小数第1位を切り上げて、整数で求めよ。ここで、操作部からの指示・レジからの入金終了の通知はなく、硬貨部・紙幣部が貨幣の取込みを完了してから送信を開始するまでの時間、制御部が硬貨部・紙幣部から受信してレジに送信するまでの時間、及び連続する電文の送信間の時間は無視できるくらい小さいものとする。
(条件)
・代金入金機能の実行時は、硬貨投入口にある硬貨、又は紙幣投入口にある紙幣の取込みを完了するごとに、レジのお客様用表示器にその入金金額を表示するまでの時間を、100ミリ秒以下とする。
・シリアルI/F1~3において、1バイトは10ビットで送受信されるものとする。
・シリアルI/F1の通信データ量は、ヘッダとペイロードを合わせて24バイトの固定長であり、通信速度は9,600ビット/秒とする。
・シリアルI/F2及びシリアルI/F3の通信データ量は、それぞれヘッダとペイロードを合わせて10バイトの固定長であり、通信速度は同じとする。
・レジは、入金金額を受信してから入金金額を表示するまで、最大で10ミリ秒掛かるものとする。
模範解答
2,500
解説
解答の導き方
求めるのは、貨幣の取込み完了から、レジのお客様用表示器に入金金額が表示されるまでを100ミリ秒以下にするための、シリアルI/F2及びシリアルI/F3の通信速度です。
まず、時間の流れを整理します。硬貨部(又は紙幣部)が取込みを完了すると、金種別枚数を10バイトの電文で制御部へ送ります。制御部はそれを入金金額に変換し、24バイトの電文でレジへ送ります。レジは受信してから最大10ミリ秒で表示します。取込み完了から送信開始まで、制御部の受信からレジへの送信開始まで、連続する電文の送信間の時間は、いずれも無視できます。
次に、最も時間が掛かる場合を考えます。硬貨部と紙幣部はそれぞれ別のシリアルI/F2・I/F3で制御部につながっているので、硬貨と紙幣の取込みが同時に完了すると、二つの電文は並行して制御部に届きます。ところが、レジにつながるシリアルI/F1は1本なので、制御部はレジへの電文を2本続けて送ることになり、後に送る側の表示が最も遅くなります。
シリアルI/F1の1電文の送信時間は、1バイトを10ビットとして、
です。2電文続くので、後の電文の送信完了までは ミリ秒掛かります。
シリアルI/F2及びシリアルI/F3の通信速度を ビット/秒とすると、10バイト(100ビット)の電文の送信時間は ミリ秒です。したがって、条件は次のようになります。
これを解くと より、
となります。端数は出ないので、必要な通信速度は2,500ビット/秒以上です。
誤りやすいポイント
- 1バイトを8ビットとして計算しないようにします。この問題では「1バイトは10ビットで送受信」と指定されています。
- レジへの電文を1本分の25ミリ秒だけで計算してしまうことです。硬貨と紙幣の取込みが同時に完了すると、シリアルI/F1で2電文が続くため、後の電文は50ミリ秒後に届きます。
- シリアルI/F2とシリアルI/F3の電文を合算してしまうことです。二つは別の通信路なので並行して送られ、それぞれ100ビットを送る時間だけを考えます。
- 100ミリ秒すべてをシリアルI/F2及びシリアルI/F3に使えると考えることです。シリアルI/F1の送信時間と、レジの表示時間を差し引きます。
FAQ
Q: なぜレジへの送信を2電文分として計算するのですか?
A: 硬貨と紙幣の取込みが同時に完了した場合、制御部は硬貨分と紙幣分の入金金額を、1本しかないシリアルI/F1で順番に送るためです。後に送る側が最も遅く表示されるので、この場合でも100ミリ秒以下に収める必要があります。
A: 硬貨と紙幣の取込みが同時に完了した場合、制御部は硬貨分と紙幣分の入金金額を、1本しかないシリアルI/F1で順番に送るためです。後に送る側が最も遅く表示されるので、この場合でも100ミリ秒以下に収める必要があります。
Q: 硬貨部と紙幣部が同時に送信すると、シリアルI/F2・I/F3の時間も2倍になりますか?
A: なりません。硬貨部はシリアルI/F2、紙幣部はシリアルI/F3と別々の通信路を使うので、二つの電文は並行して送られます。
A: なりません。硬貨部はシリアルI/F2、紙幣部はシリアルI/F3と別々の通信路を使うので、二つの電文は並行して送られます。
Q: 割り切れない値になった場合はどうしますか?
A: 問題の指示どおり小数第1位を切り上げます。必要な速度を下回ると時間条件を満たせないので、切り上げが妥当です。
A: 問題の指示どおり小数第1位を切り上げます。必要な速度を下回ると時間条件を満たせないので、切り上げが妥当です。
関連キーワード: シリアル通信、通信速度、固定長電文、伝送時間、最悪応答時間
設問1(3)
問題文を見る模範解答
c:金種情報
d:表示部に表示
e:入金禁止
解説
解答の導き方
-
釣銭補充では、操作部からの指示で投入された貨幣を取り込みます。表2には、制御部が硬貨部・紙幣部から受け取る金種別枚数を「補充金種」とするとあります。これは、釣銭機内に新たに加わった貨幣の枚数です。
-
したがって、制御部は受け取った補充金種を現在の金種別枚数に反映します。釣銭機内の金種別枚数を示す情報は「金種情報」なので、更新する対象は金種情報です。受信するたびに補充分を加えて、釣銭機内の在庫を正しく管理します。
-
表1では、表示部が金種情報を「常時表示する」とされています。そのため、補充によって金種情報を更新した後は、更新内容を表示部に表示します。
-
補充終了後の処理は、代金入金の終了時と同じ考え方です。表2の代金入金には、入金終了を受信した制御部が硬貨部・紙幣部に「入金禁止」を送信し、受信した硬貨部・紙幣部は貨幣が投入されても動作しないとあります。補充終了後も投入を受け付けない状態にするため、送信するのは入金禁止です。
誤りやすいポイント
- 補充金種は、今回取り込んだ貨幣の枚数です。現在の金種情報を補充金種で置き換えるのではなく、補充分を反映して更新します。
- 釣銭補充は代金の支払いではありません。補充した貨幣の金額をレジへ送る処理ではなく、釣銭機内の金種情報を更新して表示します。
- 入金禁止は、補充終了後に硬貨部・紙幣部が新たな投入貨幣を取り込まないようにする指示です。
FAQ
Q: なぜ補充のたびに金種情報を更新するのですか?
A: 貨幣が追加されるたびに、釣銭機内にある金種別枚数を実際の状態と一致させるためです。
A: 貨幣が追加されるたびに、釣銭機内にある金種別枚数を実際の状態と一致させるためです。
Q: 補充終了後に入金禁止を送るのはなぜですか?
A: 終了後に貨幣が投入されても、補充処理が続いたり金種情報と実際の枚数がずれたりしないようにするためです。
A: 終了後に貨幣が投入されても、補充処理が続いたり金種情報と実際の枚数がずれたりしないようにするためです。
Q: 更新した金種情報を表示するのはなぜですか?
A: 表示部には金種情報を常時表示する仕様だからです。
A: 表示部には金種情報を常時表示する仕様だからです。
関連キーワード: 在庫管理、状態更新、表示制御、入力制御
設問2:制御部のソフトウェアについて、(1)~(3)に答えよ。
設問2(1)
問題文を見る硬貨だけの釣銭補充機能を実行したとき、操作部指示タスクが金種情報を更新するのは、どのタスクからどのような情報のメッセージを受けたときか。30字以内で述べよ。
模範解答
硬貨部制御タスクから補充金種の情報を受けたとき
解説
解答の導き方
-
ここで問われているのは、硬貨だけの釣銭補充中に、操作部指示タスクが金種情報を更新するきっかけとなるメッセージです。
-
表2の釣銭補充の説明では、硬貨部から送られた金種別枚数を「補充金種」として受信するごとに、制御部が金種情報を更新するとあります。つまり、硬貨を取り込んだ結果として得られる補充金種が、更新に必要な情報です。
-
表3では、硬貨部制御タスクは他のタスクから依頼された硬貨部への指示を実行し、その結果を依頼元タスクに送信するとされています。釣銭補充の指示を実行しているのは操作部指示タスクなので、補充金種の情報は硬貨部制御タスクから操作部指示タスクへ返されます。
-
したがって、操作部指示タスクが金種情報を更新するのは、硬貨部制御タスクから補充金種の情報を受けたときです。
誤りやすいポイント
- 補充金種を送る相手を、硬貨部そのものと考えないようにします。タスク間のメッセージを扱うのは硬貨部制御タスクです。
- レジ指示タスクからのメッセージと混同しないようにします。釣銭補充は操作部からの指示で行うため、依頼元は操作部指示タスクです。
- 金種情報の更新を、補充開始時や補充終了時に行うと考えないようにします。表2では、補充金種を受信するごとに更新するとされています。
FAQ
Q: 補充金種とは何ですか?
A: 補充で硬貨部に取り込まれた硬貨の金種別枚数です。
A: 補充で硬貨部に取り込まれた硬貨の金種別枚数です。
Q: なぜ金種情報の更新を操作部指示タスクが行うのですか?
A: 釣銭補充は操作部からの指示で実行され、その指示を処理するタスクが操作部指示タスクだからです。
A: 釣銭補充は操作部からの指示で実行され、その指示を処理するタスクが操作部指示タスクだからです。
Q: 硬貨部制御タスクは、なぜ補充金種を操作部指示タスクへ送るのですか?
A: 表3では、硬貨部制御タスクは依頼された処理を実行し、その結果を依頼元タスクに送信するとされているためです。
A: 表3では、硬貨部制御タスクは依頼された処理を実行し、その結果を依頼元タスクに送信するとされているためです。
関連キーワード: タスク間通信、メッセージ通信、金種情報、排他制御、リアルタイムOS
設問2(2)
問題文を見る紙幣だけの釣銭出金機能を実行したとき、レジ指示タスクが紙幣部制御タスクに通知するメッセージの内容を、15字以内で述べよ。
模範解答
出金金種での出金指示
解説
解答の導き方
-
問われているのは、紙幣だけで釣銭を出金するときに、レジ指示タスクから紙幣部制御タスクへ渡されるメッセージの内容です。レジへ返す出金結果ではなく、紙幣部に出金を依頼するための情報を考えます。
-
表2の「釣銭出金」には、制御部が釣銭金額を金種別枚数に変換し、紙幣の出金金種がある場合は紙幣部に「出金金種での出金指示」を送信するとあります。つまり、紙幣部に渡すのは、出金する紙幣の金種別枚数を示す出金金種と、それに基づく出金指示です。
誤りやすいポイント
- レジ指示タスクが受け取る釣銭金額を、そのまま紙幣部制御タスクへ送ると考えないようにします。表2では、釣銭金額を金種別枚数に変換してから出金指示を送ります。
- 「出金金額」は出金前に紙幣部へ渡す情報ではありません。表2では、実際に出金した金種別枚数を受信した後、金額に変換してレジへ送る情報です。
- 紙幣だけの出金なので、硬貨部制御タスクへの指示は考えません。
FAQ
Q: 紙幣部制御タスクへ渡すのは、紙幣の枚数だけですか?
A: 枚数だけではなく、どの金種を何枚出金するかを示す出金金種と、それに基づく出金指示です。
A: 枚数だけではなく、どの金種を何枚出金するかを示す出金金種と、それに基づく出金指示です。
Q: 出金指示と出金結果はどう違いますか?
A: 出金指示は紙幣部に出金を依頼する情報です。出金結果は、紙幣部が実際に出金した金種別枚数を制御部へ通知する情報です。
A: 出金指示は紙幣部に出金を依頼する情報です。出金結果は、紙幣部が実際に出金した金種別枚数を制御部へ通知する情報です。
関連キーワード: タスク間通信、メッセージ通信、金種変換、排他制御、資源管理
設問2(3)
問題文を見るシリアルI/F2通信タスクとシリアルI/F3通信タスクは、使用するシリアルI/Fコントローラのハードウェア仕様及び通信手順が同じなので、プログラムの実体は一つとし、タスクを二つ生成することにした。ここで、タスクによって異なる部分に対して、生成するタスクごとにパラメタを与えることにした。このパラメタは二つあり、一つはシリアルI/FコントローラのI/Oアドレス、送受信バッファアドレスなどのシリアルI/Fコントローラ制御関連のパラメタである。もう一つのパラメタを25字以内で述べよ。
模範解答
メールを送受信するメールボックス番号
解説
解答の導き方
-
問題では、シリアルI/F2通信タスクとシリアルI/F3通信タスクについて、「プログラムの実体は一つ」とし、タスクごとに異なる部分をパラメタで与えるとしています。つまり、共通の処理を使いながら、通信相手などの違いをパラメタで切り替える必要があります。
-
一つ目のパラメタは、I/Oアドレスや送受信バッファアドレスなど、シリアルI/Fコントローラを制御するための情報です。これは、シリアルI/F2通信タスクとシリアルI/F3通信タスクがそれぞれ異なるハードウェアを扱うために必要です。
-
それとは別に、タスク間のメッセージ通信で使う情報も必要です。図3では、シリアルI/F2通信タスクは硬貨部制御タスクと、シリアルI/F3通信タスクは紙幣部制御タスクと、それぞれメッセージをやり取りします。図3の注記にあるとおり、この通信にはメールボックスが使われます。
-
したがって、各タスクが自分の通信に使うメールボックスを識別できるよう、二つ目のパラメタにはメールボックス番号を指定します。送信と受信の両方に使う番号であることを含めて表現すればよいです。
誤りやすいポイント
- 二つ目のパラメタもI/Oアドレスやバッファアドレスなどのハードウェア情報だと考えないようにします。一つ目のパラメタとして、すでにその情報が挙げられています。
- シリアル通信の速度や通信データの形式を答えないようにします。問われているのは、タスク間のメッセージ通信に関するパラメタです。
- メッセージの内容ではなく、メッセージの送受信に使用するメールボックスを識別する情報が必要です。
FAQ
Q: 同じプログラムの実体を使うのに、なぜタスクごとのパラメタが必要なのですか?
A: 共通の処理を使いつつ、各タスクが扱うシリアルI/Fコントローラや通信相手の違いを区別するためです。
A: 共通の処理を使いつつ、各タスクが扱うシリアルI/Fコントローラや通信相手の違いを区別するためです。
Q: メールボックス番号は、どの違いを区別するために使いますか?
A: タスクがどのメールボックスを使ってメッセージを送受信するかを区別します。
A: タスクがどのメールボックスを使ってメッセージを送受信するかを区別します。
Q: 図3の矢印は何を表していますか?
A: 実線の矢印は、メールボックスを使用したタスク間のメッセージ通信の方向を表しています。
A: 実線の矢印は、メールボックスを使用したタスク間のメッセージ通信の方向を表しています。
関連キーワード: タスク間通信、メールボックス、メッセージ通信、パラメータ化、リアルタイムOS
設問3:テスト時に、制御部のソフトウェアで発生した次の不具合について、(1)~(3)に答えよ。
テスト時に、硬貨と紙幣の釣銭出金機能及び硬貨と紙幣の釣銭補充機能の動作をほぼ同時に行ったところ、硬貨の出金動作だけを実行した後、釣銭機の動作が停止する不具合が発生した。この不具合の原因に関するソフトウェアの調査結果を、次に示す。
硬貨部と紙幣部の二つの資源を使用する場合、レジ指示タスクは、硬貨部の資源を獲得して硬貨部制御タスクへ指示を通知、次に紙幣部の資源を獲得して紙幣部制御タスクへ指示を通知、その後指示した動作の終了で二つの資源を解放する処理となっていた。操作部指示タスクは、紙幣部の資源を獲得した後、硬貨部の資源を獲得する処理となっていた。また、レジ指示タスクと操作部指示タスクのタスク優先度の関係はレジ指示タスクの方が高く、シリアルI/F1通信タスク、シリアルI/F2通信タスク及びシリアルI/F3通信タスクのタスク優先度は同一で、制御部のタスクの中で最も高いものとなっていた。
設問3(1)
問題文を見るどのタスクが、どのような処理をしていたときに、どのタスクが起動されると、このような不具合が発生するのか。不具合が発生するときの状況を、60字以内で述べよ。
模範解答
操作部指示タスクが、紙幣部の資源を獲得後、紙幣部制御タスクに指示を出す前に、レジ指示タスクが起動された。
解説
解答の導き方
この不具合の鍵は、二つのタスクが硬貨部と紙幣部の資源を、反対の順序で獲得しようとしている点です。
本文では、レジ指示タスクは「硬貨部の資源を獲得して硬貨部制御タスクへ指示を通知、次に紙幣部の資源を獲得」します。一方、操作部指示タスクは「紙幣部の資源を獲得した後、硬貨部の資源を獲得する」とあります。つまり、一方は硬貨部から紙幣部へ、もう一方は紙幣部から硬貨部へと、資源を獲得する順序が逆です。
ここで、操作部指示タスクが紙幣部の資源を獲得したものの、紙幣部制御タスクに指示を出す前に、レジ指示タスクが起動される状況を考えます。本文には「レジ指示タスクの方が高く」とあるため、レジ指示タスクが操作部指示タスクを中断して処理を進めます。
レジ指示タスクは、先に硬貨部の資源を獲得して硬貨部制御タスクへ指示を出します。その後、紙幣部の資源を獲得しようとしますが、これは操作部指示タスクが保持しているため、レジ指示タスクは待ち状態になります。そこで操作部指示タスクが処理を再開して硬貨部の資源を求めても、その資源はレジ指示タスクが保持しているため、こちらも待ち状態になります。
このように、レジ指示タスクは紙幣部の資源を、操作部指示タスクは硬貨部の資源を、それぞれ相手が保持したまま待つ状態になります。硬貨部への指示は先に実行されますが、その後、双方が先へ進めなくなるため、釣銭機の動作が停止します。
誤りやすいポイント
- レジ指示タスクの優先度が高いことだけで、不具合を説明しないようにします。優先度の違いに加え、二つのタスクが資源を逆順に獲得することで、互いに相手の資源を待つ状態が生じます。
- 硬貨の出金が実行されたことだけに注目しないようにします。レジ指示タスクは硬貨部への指示の後に紙幣部の資源を求めるため、紙幣部の資源を獲得できないことが停止につながります。
- 問われているのは、停止後の対策ではなく、不具合が発生するタイミングです。操作部指示タスクが紙幣部の資源を獲得した後、紙幣部制御タスクへの指示前にレジ指示タスクが起動される状況を押さえます。
FAQ
Q: 優先度の高いレジ指示タスクが、処理を最後まで進めれば解決しませんか?
A: 紙幣部の資源を操作部指示タスクが保持しているため、レジ指示タスクはそこで待ち状態になります。優先度が高くても、他のタスクが保持する資源を使うことはできません。
A: 紙幣部の資源を操作部指示タスクが保持しているため、レジ指示タスクはそこで待ち状態になります。優先度が高くても、他のタスクが保持する資源を使うことはできません。
Q: なぜ硬貨の出金だけは実行されるのですか?
A: レジ指示タスクは紙幣部の資源を求める前に硬貨部へ指示を出すためです。その後、紙幣部の資源を獲得できずに待ち状態になります。
A: レジ指示タスクは紙幣部の資源を求める前に硬貨部へ指示を出すためです。その後、紙幣部の資源を獲得できずに待ち状態になります。
Q: この不具合を防ぐには、どの考え方が重要ですか?
A: 複数の資源を使うタスクでは、資源を獲得する順序をそろえることが重要です。順序がそろっていれば、互いに相手の資源を待つ状態が起きにくくなります。
A: 複数の資源を使うタスクでは、資源を獲得する順序をそろえることが重要です。順序がそろっていれば、互いに相手の資源を待つ状態が起きにくくなります。
関連キーワード: デッドロック、相互排除、資源獲得順序、循環待ち、タスク優先度
設問3(2)
問題文を見るタスク優先度だけを変更して対策をする場合、レジ指示タスクと操作部指示タスクのタスク優先度の関係をどのような設定にすればよいか。20字以内で述べよ。
模範解答
タスク優先度を同じにする。
解説
解答の導き方
この設問では、レジ指示タスクと操作部指示タスクの優先度の関係を変更し、二つの資源を待ち合う状態を防ぐ方法を考えます。
本文によると、レジ指示タスクは「硬貨部の資源」を獲得してから「紙幣部の資源」を獲得します。一方、操作部指示タスクは「紙幣部の資源」を獲得してから「硬貨部の資源」を獲得します。つまり、二つのタスクで資源を獲得する順序が逆です。
現在のようにレジ指示タスクの優先度が高いと、操作部指示タスクが紙幣部の資源を獲得した直後にレジ指示タスクが起動し、先に硬貨部の資源を獲得することがあります。その後、レジ指示タスクは操作部指示タスクが保持している紙幣部の資源を待ちます。操作部指示タスクも、レジ指示タスクが保持している硬貨部の資源を待つため、どちらのタスクも先へ進めなくなります。
この状況を避けるには、レジ指示タスクが優先度の高さを理由に操作部指示タスクを途中で中断しないようにします。両タスクの優先度を同じにすれば、レジ指示タスクだけが優先度によって割り込む関係ではなくなり、資源獲得の途中で一方が他方の資源を保持したまま待つ事態を防げます。
誤りやすいポイント
- 二つのタスクで資源の獲得順序が逆である点だけに注目し、設問が求める「優先度の関係」を答えないことです。
- レジ指示タスクの優先度をさらに高くすれば処理が早く進むと考えるのは誤りです。優先度の高いタスクが処理を割り込むことが、資源の待ち合いを発生させるきっかけになります。
- 資源を獲得する順序を統一する方法も考えられますが、この設問はタスク優先度だけを変更する場合を尋ねています。
FAQ
Q: なぜ二つの資源を待ち合う状態が起きるのですか?
A: 一方のタスクが紙幣部の資源を保持しながら硬貨部の資源を待ち、もう一方のタスクが硬貨部の資源を保持しながら紙幣部の資源を待つためです。
A: 一方のタスクが紙幣部の資源を保持しながら硬貨部の資源を待ち、もう一方のタスクが硬貨部の資源を保持しながら紙幣部の資源を待つためです。
Q: 優先度を同じにする目的は何ですか?
A: レジ指示タスクが優先度の高さによって操作部指示タスクを資源獲得の途中で割り込む状況を避け、資源の待ち合いを防ぐためです。
A: レジ指示タスクが優先度の高さによって操作部指示タスクを資源獲得の途中で割り込む状況を避け、資源の待ち合いを防ぐためです。
Q: 資源の獲得順序を統一する方法ではいけませんか?
A: それも一般的な対策ですが、この設問では優先度だけを変更する条件なので、両タスクの優先度の関係を答えます。
A: それも一般的な対策ですが、この設問では優先度だけを変更する条件なので、両タスクの優先度の関係を答えます。
関連キーワード: デッドロック、タスク優先度、資源獲得、排他制御、優先度ベーススケジューリング
設問3(3)
問題文を見る操作部指示タスクだけを変更して対策をする場合の修正方法を、30字以内で述べよ。
模範解答
硬貨部の資源を獲得後に紙幣部の資源を獲得する。
解説
解答の導き方
この設問では、操作部指示タスクだけを変更して、釣銭機が停止する不具合を防ぐ方法を考えます。
まず、本文では、レジ指示タスクは「硬貨部の資源を獲得」してから「紙幣部の資源を獲得」します。一方、操作部指示タスクは「紙幣部の資源を獲得した後、硬貨部の資源を獲得する」とあり、二つのタスクで資源を獲得する順序が逆です。
この順序の違いがあると、ほぼ同時に処理を始めたとき、レジ指示タスクが硬貨部の資源を保持し、操作部指示タスクが紙幣部の資源を保持する状況が起こり得ます。その後、レジ指示タスクは紙幣部の資源を待ち、操作部指示タスクは硬貨部の資源を待つことになります。互いに相手が保持する資源を待ち続けるため、処理が進まなくなります。これはデッドロックです。
操作部指示タスクだけを変更するには、レジ指示タスクと資源の獲得順序をそろえます。つまり、操作部指示タスクも硬貨部の資源を先に獲得し、その後に紙幣部の資源を獲得する順序にします。両タスクが同じ順序で資源を獲得すれば、互いに異なる資源を先に保持して相手を待つ状態を避けられます。
誤りやすいポイント
- 資源を二つ使うこと自体を原因と考え、資源を一つしか使わないように変更するのは適切ではありません。問題となるのは、二つのタスクで資源獲得の順序が逆になっていることです。
- タスクの優先度を変更することと、資源の獲得順序をそろえることは別の対策です。この設問では操作部指示タスクだけを変更するため、資源を獲得する順序を変更します。
- 硬貨部の資源を獲得してから紙幣部の資源を獲得するという順序を、レジ指示タスク側で変更するのではありません。変更対象は操作部指示タスクです。
FAQ
Q: なぜ資源の獲得順序をそろえるとデッドロックを防げるのですか?
A: どちらのタスクも同じ順で資源を求めるため、一方が先に取得した資源を保持したまま、もう一方が先に取得した別の資源を待つ、という循環した待ち状態を避けられるからです。
A: どちらのタスクも同じ順で資源を求めるため、一方が先に取得した資源を保持したまま、もう一方が先に取得した別の資源を待つ、という循環した待ち状態を避けられるからです。
Q: 資源を取得できなかった場合、タスクはすぐに資源を解放すればよいのですか?
A: この設問で求められているのは、操作部指示タスクの資源獲得順序の修正です。資源を解放する処理を追加するのではなく、両タスクの獲得順序をそろえることで、原因となる待ち状態を防ぎます。
A: この設問で求められているのは、操作部指示タスクの資源獲得順序の修正です。資源を解放する処理を追加するのではなく、両タスクの獲得順序をそろえることで、原因となる待ち状態を防ぎます。
関連キーワード: デッドロック、資源獲得順序、循環待ち、相互排除、タスク優先度




