リアルタイムオペレーティングシステムは、厳しい時間制約の中で、高い信頼性と精度でデータを処理し、タスクを実行します。RTOSは、遅延が操作上または安全上の問題につながる恐れがある状況で重要になる可能性があり、工業システム、自動車制御器、および医療機器で広く使用されています。このドキュメントでは、リアルタイムオペレーティングシステムとは何かについて説明するとともに、測定/制御アプリケーションで使用した場合のメリットや、Windowsといった標準の汎用オペレーティングシステムとの違いについて詳しく解説します。
以下のセクションでは、リアルタイムオペレーティングシステムの基本概念と用語について概説します。その後のステップとして、「NIハードウェアとソフトウェアでリアルタイムシステムを構築する」をお読みいただくことをお勧めします。このページでは、短時間で優れたリアルタイムシステムを構築する方法を解説しています。
一般に、オペレーティングシステム (OS) の役割は、コンピュータのハードウェアリソースの管理と、コンピュータ上で実行するアプリケーションのホストです。RTOSは、そうしたタスクを実行するだけでなく、非常に正確なタイミングと高い信頼性でアプリケーションを実行するよう特別に設計されています。 この信頼性は、ダウンタイムによってコストが高くついたり、プログラムの遅延によって安全面に支障をきたす測定/オートメーションシステムでは、特に重要なことです。
「リアルタイム」と言えるのは、実行するそれぞれの重要処理に対し、既知の最大時間がある (あるいは、少なくとも最大時間を保証できる) オペレーティングシステムです。そのような処理には、OS呼び出しや割り込み処理などがあります。そうした操作に対し最大時間を絶対的に保証できるオペレーティングシステムを一般に「ハードリアルタイム」と呼び、ほとんどの最大時間しか保証できないオペレーティングシステムは、「ソフトリアルタイム」と呼ばれます。実際には、このような厳密な分類の意味は限られています。各RTOSソリューションはそれぞれ固有の性能特性があり、ユーザはそういった特性を1つずつ綿密に見極める必要があります。
そういった概念を正しく理解するため、1つの例について考えてみます。例えば、新車のエアバッグシステムを設計しているとします。この場合、タイミングにわずかでも誤差が生じる (エアバッグの開くのが早すぎる/遅すぎる) と、重大な事故となり負傷につながる恐れがあります。したがってハードリアルタイムシステムが不可欠です。いかなる操作も特定のタイミング制限を超えることは許されないからです。一方、ストリーミングビデオを受信する携帯電話の場合は、もちろん抜けることなくビデオをストリーミングできるに越したことはないものの、たまに多少のデータが落ちることは許容範囲でしょう。このアプリケーションでは、おそらくソフトリアルタイムオペレーティングシステムで十分です。
つまり要約すると、正しくプログラミングすれば、RTOSは極めて一貫性の高いタイミングでプログラムを実行することが保証されているということです。リアルタイムオペレーティングシステムがそのような信頼性を実現できるのは、タスクの優先順位付けに関してプログラマの自由度が高く、重要な期限が守られていることを確認することも可能だからです。
リアルタイムオペレーティングシステムと異なり、パーソナルコンピュータ用のほとんどの一般向けオペレーティングシステム (Windowsなど) は、汎用オペレーティングシステムと呼ばれます。リアルタイムオペレーティングシステムと汎用オペレーティングシステムの違いについては以降のセクションで詳しく説明しますが、どちらのOSにもそれぞれ長所と短所があることを覚えておく必要があります。Windowsなどのオペレーティングシステムは、多くのプログラムやサービスが稼働する中でユーザ入力への応答性を維持できるように設計されているのに対し (「公平性」を確保)、リアルタイムオペレーティングシステムは、重要なアプリケーションを高精度なタイミングで確実に実行するよう設計されています (プログラマの優先順位を重視)。
確定性:ハードリアルタイムオペレーティングシステムで実行するアプリケーション (あるいはアプリケーションの重要部分) で、特定の誤差内での実行が保証されている場合、確定性があるということになります。
ハード対 ソフトリアルタイム:演算にかかる絶対的最長時間を保証できるOSは、ハードリアルタイムと呼ばれます。一方、通常ある程度の時間をかけて演算を実行するOSは、ソフトリアルタイムと呼ばれます。
ジッタ:プログラムまたはループの以降の反復処理におけるタイミングの誤差をジッタといいます。リアルタイムオペレーティングシステムは、正しくプログラミングすればジッタを少なくできるよう設計されています。タスクは何度実行してもほぼ同じ時間で実行できるようになっています。
図1: ジッタは、以降の反復処理でタスクの実行時間がどれだけ違うかを示すものです。リアルタイムオペレーティングシステムは、ジッタを最小限に抑えるように最適化されています。
リアルタイムオペレーティングシステムは、イベント応答と閉ループ制御という、2つのアプリケーションクラス向けに開発されたものです。組立ライン部品の自動目視検査などのイベント応答アプリケーションでは、刺激に対して一定時間内に応答することが求められます。たとえば、この目視検査システムでは、組立ラインが動く前に各部品を撮影し、解析しなければなりません。
ハードリアルタイムオペレーティングシステム上で実行するアプリケーションを綿密にプログラミングすることで、確定的に (一定の最大時間内で) 応答するイベント応答アプリケーションを開発することができます。部品検査の例では、汎用OSを使用した場合検査漏れが出る恐れがあります。そのため組立ラインの速度を下げたり、部品を破棄することになるか、あるいは欠陥品の可能性のある部品が出荷される恐れもあります。
一方、自動車のクルーズ制御システムなどの閉ループ制御システムでは、フィードバックデータを連続的に処理して、1つ以上の出力を調整します。 各出力値は決められた時間内に入力データを処理することにかかっているので、正しい出力を生成するためには、ループ期限が守られることが極めて重要です。クルーズ制御システムが一定の時間内にスロットル設定を決められなかったら、どうなるでしょうか。繰り返しますが、ハードリアルタイムオペレーティングシステムでは、制御システムの入力データを一定の時間内 (決められた最悪ケースの最長時間) に処理することが保証されています。
また、長時間実行しなければならない多くのアプリケーションは、RTOSが提供できる信頼性からメリットを受けることができることにも注意する必要があります。リアルタイムオペレーティングシステムは通常、多くのアプリケーションやプロセスを同時に実行するのではなく、最少限のソフトウェアを実行します。そのため24時間365日稼動する必要のあるシステムや、ダウンタイムが許されなかったり大きなコストにつながるようなシステムに最適です。
次回のプロジェクトでRTOSを検討しようとお考えの方は、こちらもご覧ください:リアルタイムシステムを採用するメリット
Microsoft WindowsやMac OSといったオペレーティングシステムは、重要性の低い測定/制御アプリケーションの開発と実行には非常に優れたプラットフォームです。ただしリアルタイムオペレーティングシステムとは異なるユースケースを想定しており、高精度なタイミングや長期の稼動時間が求められるアプリケーションの実行には適していません。このセクションでは、この2つのオペレーティングシステムの技術的な違いについて説明するとともに、リアルタイムアプリケーションをプログラミングする際の注意点について解説します。
アプリケーションをプログラミングする際、その種類に関わらずほとんどのオペレーティングシステムでは、アプリケーション全体や、場合によってはアプリケーション (スレッド) 内の様々なタスクについても、プログラマが優先順位を指定することができます。そうした優先順位は、開発者がどの処理を最も重要と考えているかをOSに伝える役割を果たします。その目的は、2つ以上のタスクが同時に実行可能な状態になった場合、OSが優先順位の高いタスクを実行することです。
実際には、汎用オペレーティングシステムは、プログラムされた優先順位に必ずしも厳密に従うわけではありません。汎用オペレーティングシステムは、さまざまななアプリケーションやプロセスを同時に実行するよう開発されているので、全てのタスクが少なくともある程度の処理時間を与えられることが最も重視されます。その結果、場合によっては、低優先タスクでも、高優先タスクより先に実行されることもあり得ます。これにより、各タスクの実行時間はある程度確保されますが、設計者の意向が必ずしも反映されるとは限りません。
一方、リアルタイムオペレーティングシステムは、プログラマの優先順位をより厳密に守ります。ほとんどのリアルタイムオペレーティングシステムでは、高優先タスクがプロセッサを100%使っている場合、より優先度の低い他のタスクは高優先タスクの実行が終わるまで実行されません。そのため、リアルタイムシステムの開発者は、優先度を考慮しながら慎重にアプリケーションをプログラムする必要があります。一般的なリアルタイムアプリケーションの場合、開発者はタイムクリティカルコード (イベント応答や制御コードなど) を優先度の高い1つのセクションに配置します。ディスクへのロギングやネットワーク通信など、優先度の低い他のコードは、優先度の低いセクションに集められることがあります。
割り込み遅延とは、デバイスが割り込みを生成してから、そのデバイスがサービスを受けられるまでの時間をいいます。汎用オペレーティングシステムでは、ある特定の割り込みに対する応答までの時間は様々ですが、リアルタイムオペレーティングシステムでは、全ての割り込みがある特定の最大時間内に確実に実行されなくてはなりません。つまり、リアルタイムオペレーティングシステムの割り込み遅延には制限があるということです。
一般的に誤解されていることの1つに、リアルタイムシステムは、汎用オペレーティングシステムよりも性能が優れているとの認識があります。リアルタイムオペレーティングシステムは、アプリケーション間やサービス間のマルチタスク処理が少ないため、場合によっては性能が優れていると言えなくはありません。しかし、実際のアプリケーションの性能は、CPU速度、メモリアーキテクチャ、プログラム特性などによって決まります。
リアルタイムオペレーティングシステムの実行速度自体は速い場合もそうでない場合もありますが、汎用オペレーティングシステムに比べ、はるかに正確で予測可能なタイミング特性を持っていることは確かです。
以下の資料では、NIのソフトウェアとハードウェアを使用し、できるだけ短時間で優れたリアルタイムシステムを構築する方法を解説しています: