令和5年度 秋期 エンベデッドシステムスペシャリスト試験 午前II 問6
テクノロジOS・ソフトウェア組込み・IoTタスク管理・排他制御
優先度に基づくプリエンプティブスケジューリングのリアルタイムOSを使用した組込みシステムにおいて,入力装置及び出力装置にアクセスする二つのタスクX,Yがある。XはYより優先度が低く,Xが資源待ち状態でない場合にYが資源待ち状態に遷移するとXが実行状態に遷移する。入力装置及び出力装置へのアクセスを排他制御するために,入力装置及び出力装置にそれぞれバイナリセマフォi及びoを用意し,X,Yを図のように実装したとき,デッドロックが発生するのはXの処理A,B,C又はDのうち,どの処理中にプリエンプションが発生してYが実行されたときか。ここで,Yの実行はαから行うものとし,Xの処理A,B,C及びDでは入力装置及び出力装置へのアクセス及びバイナリセマフォの操作は行わないものとする。

図の説明テキスト
タスクXとタスクYの処理フロー図。
【タスクX】
以下の順序で直線的に処理が遷移する:
- 出力データの準備
- 処理A
- セマフォi取得
- 処理B
- セマフォo取得
- 処理C
- 入力装置及び出力装置へのアクセス
- 処理D
- セマフォo解放
- セマフォi解放
- 入力データの加工
【タスクY】
開始位置「α」から以下の順序で直線的に処理が遷移する:
- 出力データの準備
- セマフォo取得
- セマフォi取得
- 入力装置及び出力装置へのアクセス
- セマフォi解放
- セマフォo解放
- 入力データの加工
解答・解説
正解: イ. 処理B
デッドロックとは
複数のタスクが互いに相手の持っている資源(セマフォなど)の解放を待ち合い、どのタスクも処理を先に進めることができなくなる状態です。
正解の根拠
タスクXとタスクYの処理フローから、各タスクのセマフォ取得順序は以下のようになっています。
デッドロックが発生するのは、タスクXが片方のセマフォを取得した状態でタスクYが実行され、タスクYがもう片方のセマフォを取得した場合です。この状況になると、タスクYはタスクXが持つセマフォiを待って資源待ち状態になり、実行状態に遷移したタスクXもタスクYが持つセマフォoを待って資源待ち状態になります。
タスクXの処理フローにおいて、「3. セマフォi取得」と「5. セマフォo取得」の間にあるのは「4. 処理B」です。したがって、処理Bの実行中にプリエンプションが発生してタスクYが開始されると、タスクYは「2. セマフォo取得」を成功させますが、「3. セマフォi取得」で資源待ち状態になります。その後、実行状態に遷移したタスクXは「5. セマフォo取得」で資源待ち状態となるため、互いの資源を待ち合うデッドロックが発生します。
各選択肢の解説
ア: 処理AはタスクXがどのセマフォも取得していない状態です。タスクYが実行されると、タスクYはセマフォoとセマフォiを順番に取得して処理を完了し、セマフォを解放します。その後タスクXが実行されるため、デッドロックは発生しません。
イ: 正解です。タスクXがセマフォiを取得済みで、セマフォoは未取得の状態であり、タスクYが実行されると互いに資源を待ち合うデッドロックが発生します。
ウ: 処理CはタスクXがセマフォiとセマフォoの両方を取得済みの状態です。タスクYが実行されると、タスクYは最初のセマフォoの取得で資源待ち状態になります。これによりタスクXが実行状態に戻って処理を完了し、両方のセマフォを解放するため、デッドロックは発生しません。
エ: 処理DもタスクXがセマフォiとセマフォoの両方を取得済みの状態です。処理Cと同様に、タスクYはセマフォoの取得で資源待ち状態になり、タスクXが処理を完了してセマフォを解放するため、デッドロックは発生しません。