pulpul 日本の試験

エンベデッドシステムスペシャリスト 概念書 · 組込み・コンピュータシステム

排他制御とタスク間通信

排他制御とは、複数のタスクが入出力装置などの共有資源へ同時にアクセスして、データの不整合や動作の不具合が起きることを防ぐ仕組みである。タスク間通信とは、タスクどうしがデータや事象の発生を受け渡して協調動作するための機能であり、リアルタイムOSではセマフォ、イベントフラグ、メールボックス、キューなどが用いられる。

セマフォと通信手段の仕組み

セマフォは非負の整数値を持つ変数であり、P操作とV操作の二つの操作によって資源の利用を管理する。P操作は値を減らして資源を確保する操作であり、値が0以下になるときは待ち状態に入る。 V操作は値を増やして資源を解放する操作であり、そのセマフォで待っているタスクがあれば、その一つを実行可能状態へ移す。

初期値を1とした二値のセマフォでは、P操作を資源のロック、V操作をアンロックに対応させることで、一度に一つのタスクだけが資源を使う排他制御を実現できる。

I²Cバスのように一つの共有装置を複数のタスクで使う場合、各タスクはバスを使う前にロックを取得し、使い終わったら解放する。このような相互排他の用途にはセマフォ(相互排他用のミューテックスとして使う形)が適している。

キューはデータを順番に受け渡す機能であり、共有装置の同時使用を防ぐ用途には向かない。

デッドロックの成立と防止

デッドロックとは、複数のタスクがそれぞれ資源を保持したまま相手の保持する資源を待ち合い、誰も先へ進めなくなる循環待ちの状態である。二つのタスクが同じ二つの資源を逆の順序で取得すると、一方が資源1を保持して資源2を待ち、他方が資源2を保持して資源1を待つ状態が生じ得るため、循環待ちが成立する。

これを防ぐには、二つのタスクが資源を同じ順序で獲得するように統一する方法が有効である。循環待ちの輪が作られなくなるため、デッドロックを防止できる。 三つの資源を占有する複数のプロセスでも、取得順序が揃っていなければ同様に循環待ちが生じ得る。

一方、タスクの優先度を一方だけ高くしたり両方を同じ優先度にしたりしても、資源の取得順序が揃っていなければ相互待ちは防げない。

この節の続き

ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。

アプリでこの節を読む