改めて、リアルタイムOSとは?

リアルタイムOS

今回のブログでは、改めてリアルタイムシステムや組込みシステムなどで使用されるリアルタイムOSについて説明します。

まず「組込みシステム」についてですが、センサやアクチュエータ、他の機械システム等と協調して動作するコンピュータシステムのことを指します。ロボットや工場の制御機器、コピー機やFAXなどのOA機器、エアコンや冷蔵庫などの白物家電、スマートフォンやデジタルカメラなどの身近にある機器も組込みシステムです。昨今の自動車はほとんどがコンピュータシステムで制御されていますので、自動車も組込みシステムの一つです。これらの組込みシステムは、一般的に時間的な要求が厳しく、要求されている時間内に処理を行うことが求められます。このため「リアルタイムシステム」とも呼びます。

リアルタイムオペレーティングシステム(リアルタイムOS/RTOS)は、リアルタイムシステムや組込みシステムなど、時間的な要求が厳しいアプリケーションに対応できるように作られたオペレーティングシステムの一種です。また組込みシステムに要求される、メモリリソースなどの制約が厳しいターゲットでも動作できるようコンパクトに作られており、「組込みOS(Embedded OS)」と呼ぶ場合もあります。

リアルタイムOSは、現在では航空機制御、医療機器、車載システム、産業制御、家電など、多くの組込みアプリケーションで利用されています。

リアルタイムOSの特徴

リアルタイムOSはリアルタイムシステムを実現するために、以下の特徴を持っています。他にも特徴はありますが、代表的な三つの機能を挙げてみました。

マルチタスク機能

処理の単位を”タスク”と呼び、複数のタスクを切り替えながら動作させる機能を持っています。複数のタスクを動作させる機能を、”マルチタスク機能”と呼びます。(処理の単位を”スレッド”と呼ぶ場合もありますが、実質的には同じです)

リアルタイム機能

特定のイベントや入力に対して、一定時間内に対応する処理に切り替える機能を持っています。

リアルタイムシステムは、計算結果が合っているだけではなく、決められた時間内に計算が終わることも保証する必要があり、リアルタイムOSはそのために必要な基本的な機能と性能を提供しています。

(注: 対応する処理はユーザアプリケーションで用意する必要があります)

同期・通信機能

複数のタスクを切り替えながら動作するため、タスク間のタイミングを合わせる必要があり、またタスク間の情報のやり取りを行うために同期・通信機能を持っています。

同期・通信機能にはセマフォやイベントフラグなど、いくつかの種類があり、どのような同期タイミングで処理を実行させるか、またどのような情報をやり取りするのかによって、使用する機能を選択します。

ユーザアプリケーションは、これらリアルタイムOSで用意されているマルチタスク機能や同期・通信機能を使用して、システムに要求されている機能を実現します。

WindowsやLinuxなどの汎用OSとリアルタイムOSとの比較

WindowsやLinuxのような汎用OSとリアルタイムOSは、OSとしては基本的な目的は同じで、複数の処理単位を切り替えながら動作しますが、処理単位の管理方法と処理単位の切り替え方法が異なります。

WindowsやLinuxなどのOSは、処理単位ごとにメモリ空間を分ける、プロセスモデルという形式を使用しています。処理単位をプロセスと呼び、複数のプロセスを切り替えながら動作する、マルチプロセスと呼ばれる形式で管理しています。

一方、一般的なリアルタイムOSは、OS本体や他の処理単位も含めてすべて同一のメモリ空間で管理する、スレッドモデルという形式を使用しています。処理単位をスレッドと呼び、複数のスレッドを切り替えながら動作する、マルチスレッドと呼ばれる形式で管理しています。WindowsやLinuxはスレッド形式も使用できるため、マルチプロセス・マルチスレッド形式と呼ぶこともあります。

どちらの動作モデルも、それぞれの利点欠点はあります。スレッドモデルはメモリ空間の切り替えを行わないため、プロセスモデルに比較して高速に処理単位の切り替えが可能ですが、メモリ空間が同一なため、他の処理が何らかの不正操作が行われた場合に、その処理とは関係ない処理で不具合が発生する場合もあり、原因調査に手間がかかる場合もあります。

処理単位をタスクと呼ぶこともありますが、タスクは汎用的な処理単位を表す言葉であり、文章のなかでどのように定義されているかは判断する必要があります。なお日本でよく使用されているリアルタイムOS仕様のμITRONでは、処理単位をタスクと定義していますが、μITRONのタスクはスレッドと同じ意味です。

また処理の切り替え方法も異なります。タスクの切り替え方のルールを”タスクスケジューリング”と呼びますが、WindowsやLinuxは基本的にはタイムスライススケジューリング(time slice scheduling)形式で、一定時間ごとに処理を切り替えます。またラウンドロビン(Round Robin)形式と呼ばれる、動作すべき処理を順番に実行する形式で、すべての処理を平等に実行する実行方法を取っています。

一方、一般的なリアルタイムOSでは、レートモノトニックスケジューリング(Rate-Monotonic Scheduling)形式で、処理単位に紐づけられた優先度を使用し、切り替え時に一番優先度が高い処理を実行する形式で処理を切り替えます。

組込みシステムでは、コストや実装面積の問題などから性能があまり高くないCPUを使用することが多く、より効率よくCPUを利用するためにレートモノトニックスケジューリング形式のリアルタイムOSを採用することが多くあります。もちろんWindowsやLinuxを使用した組込みシステムもありますが、WindowsやLinuxが動作できないCPUでOSが必要な処理を実行する必要がある場合は、リアルタイムOSを使用して機能を実現する必要があります。

リアルタイムOS上のアプリケーションの作り方

リアルタイムOS上で動作するアプリケーションは、WindowsやLinuxのアプリケーションと作り方が少し異なります。リアルタイムOSを使う上で、このアプリケーションの作り方の違いに慣れないため、苦労する方も多いようです。

Windowsなどの汎用OSアプリケーションは、アプリケーション毎にそれぞれ一つの役割、たとえばWordは文章を作成し、Excelは表計算を行う、などを行います。一方リアルタイムOS上で動作するアプリケーションは、一つの役割を複数のタスクで実現するような形式で動作させます。性能があまり高くないCPUを使用することが多いため、何らかの待ち状態の間に並行して別の処理を行うことで、CPUを効率よく使用して機能を実現します。

汎用OSアプリケーションでも同様の考え方で処理効率を向上させることは可能ですが、他のアプリケーションにも平等にCPUの処理時間を割り当てることが目的のスケジューリング形式では、アプリケーションの数などによって割り当てられる処理時間が変動するため、あまり効率が良い方法とは言えない場合があります。

これはアプリケーションに求められる機能が異なるためですので、どちらの考え方が正しいというものではありません。リアルタイムOSのスケジューリング形式で動作するアプリケーションは、一つの役割を複数のタスクで実現するような形式の方が、CPUを効率よく使用でき、高い性能を発揮できます。またリアルタイム性が必要な処理も、優先度が高いタスクとして用意することで、比較的容易に目的を実現できます。さらに割込み処理なども含めて、機器にもとめられているすべての動作を用意する必要があるため、アプリケーションの設計段階から、Windowsアプリケーションなどとは少々異なる処理方法の検討が必要になってきます。

モジュール分割方法などを含め、汎用的な設計に関連する技術はすでに世の中にたくさんありますが、残念ながらリアルタイムOS上で動作するアプリケーションのための一般論は無いのが現状です。機器の分野によっても、どのように設計すれば良いのかも異なってきますし、もちろん機器によって優先すべき処理も異なります。また設計者によって注目すべき機能などが異なる場合があります。まさに『銀の弾丸などない』状態ですが、アプリケーション設計者は、一つの役割を複数のタスクで実現することを念頭にシステム全体を設計することを心がけると、比較的うまく行くとは思います。

リアルタイムOS上で動作するアプリケーションを作るためには、やはり多少なりとも経験や慣れが必要です。残念ながらすでにある汎用的な設計方法をそのまま利用できない場合も多いとは思いますが、基本的な考え方などを含め、流用できる部分は多数あると考えています。本コラムを読んで興味が湧いた方は、まずは汎用的な設計に関連する技術を再度調べ直して、そのまま利用はできなくても、これなら応用できるという部分を見つけてみてください。きっとそれが良い製品を作り出す力になるでしょう。

最後に

今回は初心に帰って、改めてリアルタイムOSについて書いてみました。当社ではお客様の求めに応じて、このようなリアルタイムOS入門レベルの内容も含めて、各種セミナーを開催させていただくこともあります。もしご要望があれば各種セミナーの講師や開催などの対応も行いますので、ご相談いただければ幸いです。

リアルタイムOS製品の製品ページはこちら