リアルタイムOS(RTOS)とタスク管理を徹底解説【ES試験頻出テーマ】
RTOSとは何か
RTOS(Real-Time Operating System:リアルタイムOS)は、リアルタイム性を保証するオペレーティングシステムです。WindowsやLinuxのような汎用OSとは異なり、タスクのスケジューリングやデッドライン管理を厳密に行います。
組込みシステムで代表的なRTOSには以下があります。
| RTOS名 | 特徴 |
|---|---|
| TOPPERS(トッパーズ) | 日本発のRTOS。教育・研究でも使われる |
| FreeRTOS | オープンソースで普及率が高い。IoT機器でも使われる |
| VxWorks | 航空・防衛など高信頼性が必要な分野で採用 |
| ITRON(μITRON) | 日本の家電・産業機器向け標準仕様 |
タスクと状態遷移
RTOSにおけるタスク(プロセス)は、いくつかの状態を遷移しながら実行されます。
| タスク状態 | 説明 |
|---|---|
| 実行中(RUN) | CPUを使用して実行されている状態 |
| 実行可能(READY) | 実行可能だがCPUが他のタスクに使用されている |
| 待ち(WAIT) | イベント・セマフォ待ちなどで実行を停止している |
| 休止(DORMANT) | 起動待ちまたは終了した状態 |
💡 タスク状態遷移図は午前Ⅱで必出! 「タスクがどのような条件でどの状態に遷移するか」を問う問題が毎回出題されます。READY→RUN→WAITの遷移条件(プリエンプション・待ちの解除)を正確に理解しましょう。
タスクスケジューリング
複数のタスクが存在するとき、どのタスクをいつ実行するかを決めるのがスケジューラです。
| スケジューリング方式 | 説明 |
|---|---|
| 優先度ベーススケジューリング | 優先度の高いタスクが先に実行される(最も一般的) |
| ラウンドロビン | 同一優先度のタスクを順番に実行する(タイムスライス) |
| EDF(最早デッドライン優先) | デッドラインが最も近いタスクを優先する |
| RMS(単調レート単調) | 周期が短いタスクほど高優先度にする静的優先度方式 |
プリエンプション(横取り)とは、高優先度のタスクが実行可能になったとき、低優先度の実行中タスクを中断して高優先度タスクを実行する仕組みです。
タスク間同期・通信
複数のタスクが共有リソースを使うとき、正しい順序・排他制御が必要です。
| 機構 | 説明 |
|---|---|
| セマフォ | カウンタを使ってリソースへの同時アクセス数を制限する |
| ミューテックス | 1つのタスクだけが排他的にリソースを使用できる仕組み |
| イベントフラグ | 特定のイベント発生を待つ・通知する仕組み |
| メッセージキュー | タスク間でデータ(メッセージ)を受け渡すFIFOバッファ |
| メールボックス | メッセージキューの一種。ポインタを渡すことが多い |
⚠️ デッドロックと優先度逆転 デッドロック(複数タスクが互いのリソース解放を永遠に待ち続ける状態)と優先度逆転(低優先度タスクがリソースを占有することで高優先度タスクが待たされる問題)は試験でよく問われます。解決策(優先度継承プロトコルなど)も覚えておきましょう。
割り込み処理
割り込み(インタラプト)は、外部デバイスや内部タイマーから非同期に発生するイベントに対して、現在の処理を中断してハンドラ(割り込みサービスルーティン:ISR)を実行する仕組みです。
- 割り込みベクタ:各割り込み要因に対応するISRのアドレスが格納されたテーブル
- 割り込み優先度:複数の割り込みが同時発生したとき、優先度の高いものを先に処理
- 割り込み禁止区間:共有データの更新中に割り込みを禁止してデータ破壊を防ぐ
- ISRの設計原則:ISR内の処理は最小限にし、詳細処理はタスクに委ねる(遅延処理)
試験出題パターン別の理解ポイント
パターン1:「タスクがどの状態に遷移するか」問題
これは午前Ⅱでほぼ毎回出題される出題パターンです。以下のシナリオを理解しておくと対応できます:
- RUN → WAIT 遷移:タスクがセマフォ待ち・イベントフラグ待ち・メッセージキュー受け取り待ちなどで待機状態に入る
- WAIT → READY 遷移:別のタスクがセマフォを解放する、イベントが発生する、メッセージが到着する
- READY → RUN 遷移:スケジューラが実行可能なタスクの中から最高優先度のものをCPUに割り当てる(プリエンプション)
パターン2:「優先度逆転が発生する状況」問題
低優先度タスクがリソース(セマフォ)を保有している間に高優先度タスクが同じリソースを要求する場合、高優先度タスクが待たされてしまう現象です。試験では以下のポイントが問われます:
- 原因:低優先度タスクがリソース占有中に割り込まれない(割り込み禁止区間)
- 対策:優先度継承プロトコル(リソース保有中は優先度を一時的に上げる)、優先度上限プロトコル(リソースへのアクセス前に優先度を上げる)
パターン3:「デッドロック検出と回避」問題
複数タスクが相互にリソースの解放を待ち続ける状況です。試験では以下の対策が問われます:
- 検出方法:タイムアウト機能を導入し、一定時間応答がないタスクをリセット
- 回避方法:リソース取得順序をグローバルに統一する、相互参照を避ける設計
RTOSの実装パターンと試験への出題
実際の組込みシステム開発では、以下のような「RTOS設定パターン」が一般的です。試験では「このシステムの場合、RTOSをどう設定するか」という実装判断が問われることがあります:
| 要件 | 採用すべきRTOS設定 |
|---|---|
| 複数センサーからの非同期イベント処理 | イベント駆動型タスク+イベントフラグによる同期 |
| 定周期制御(モーター制御など) | 周期タスク+タイマー割り込み |
| 通信プロトコルの処理 | メッセージキュー+タスク間通信 |
| リアルタイム性とロバストネスの両立 | 優先度ベーススケジューリング+優先度継承プロトコル |
| 低消費電力要求 | アイドルタスク+省電力モード制御 |
よくある誤解と試験ポイント
- 誤解:「セマフォ=優先度」→ 正解:セマフォはリソース制御。優先度はスケジューラが管理
- 誤解:「割り込み禁止=全タスク停止」→ 正解:割り込み禁止で割り込みハンドラ実行を遅延。タスクスイッチは可能
- 誤解:「高優先度タスク=CPU時間が多い」→ 正解:高優先度タスクは「優先的に実行される」が、待機中なら他タスクが実行される
まとめ
📝 この記事のまとめ RTOSはリアルタイム性を保証するOS。組込みシステムの中核。 タスクはRUN/READY/WAIT/DORMANTの状態を遷移する。 スケジューリング方式:優先度ベース・ラウンドロビン・EDFなど。 タスク間通信:セマフォ・ミューテックス・イベントフラグ・メッセージキュー。 デッドロック・優先度逆転の概念と対策を確実に理解する。 割り込み処理はISRを短く保ち、処理の大部分はタスクに委ねる。 試験では「このシステムではどう設定すべきか」という実装判断が出題される。
RTOS理解は午前Ⅱ・午後Ⅰ・午後Ⅱで頻出です。タスク状態遷移図を手書きして復習し、過去問演習を繰り返すことで、確実な得点源にできます。
RTOS学習の「つまづきやすい」ポイントと解消法
つまづきポイント1:セマフォの「カウント値」の理解
セマフォは「カウンタ」を持つ仕組みです。多くの学習者は「セマフォ=ロック」と誤解していますが、実際には「リソースの数を管理する機構」です。
間違った理解:セマフォ=1か0か(ロック状態) 正しい理解:セマフォは「利用可能なリソース数」を示すカウンタ。初期値3なら、3つのリソースに最大3個のタスクが同時にアクセス可能
具体例:バッファが3個あるメッセージキュー
初期状態:セマフォ=3(3個のバッファが空いている)
タスクA がメッセージ送信→セマフォ=2
タスクB がメッセージ送信→セマフォ=1
タスクC がメッセージ送信→セマフォ=0
タスクD がメッセージ送信を試みる→セマフォが0のため待機状態に
つまづきポイント2:「優先度逆転」の具体的シナリオ
「優先度逆転」という概念を知っていても、「実際にどんな状況で起こるのか」がイメージできない学習者が多いです。
具体的なシナリオ:
タスクA(高優先度・制御用)
タスクB(低優先度・ログ出力用)
共有リソース:UART送信バッファ(シリアル出力)
1. タスクB がUART送信を開始(セマフォロック)
2. タスクA が実行可能になる
3. タスクA が同じUARTにアクセスしようとする
4. →タスクA が待機状態に!(高優先度なのに低優先度タスクに待たされている)
これが「優先度逆転」です。対策は優先度継承プロトコル(リソース保有中は優先度を上げる)。
つまづきポイント3:「プリエンプション」の意味
プリエンプション=「割り込み」ではなく「強制的な実行停止と切り替え」です。
イメージ:
タスクA(優先度10、実行中)が処理を続けていたとき、
タスクB(優先度5、実行可能)が起動する
→スケジューラがタスクA を一時停止し、タスクB を実行(プリエンプション)
→タスクB 完了後、タスクA が再開される
RTOS設計問題への対応パターン
午後Ⅰでよく「RTOS設計」が問われます。以下のパターンを理解しておくと回答しやすいです:
パターン:「複数の周期的タスク+割り込みの設計」
出題例:「10msの温度センサー読み込みタスク、50msの制御計算タスク、100msのデータログ出力タスクをどう実装するか」
思考プロセス:
- 各タスクの重要度・時間制約を判定(温度センサー>制御計算>ログ)
- 優先度を設定(温度センサータスク=最高優先度)
- タイマー割り込みで周期実行を実装
- イベントフラグで同期処理を追加
このパターンを過去問から3~5例抽出し、条件を変えて繰り返し演習することで、同じテーマの設問で確実に得点できるようになります。