Macの奴隷臍茶な話
渡邊鼎の!言いたい放談!
 

126:リアルタイム・マルチタスク・OSって?


Macpartyに、以下の文を投稿しましたので、こっちにも、だしときます。

元記事は、ITRONとリアルタイム制御についての質問だったのですが。・・・
[macparty-ml:01458] 家電との融合(Re: TRON?

渡邊鼎@言いたい放談http://www.din.or.jp/~kwat/ともうします。  素人で傍観者です。  長文です。ごめん!


プロの方もいらっしゃるとは思いますが、なかなか書き込みがないもんで、
ちょっと聞きかじってる範囲を書いてみます。
間違ってるかもしれませんが、そのときは、素人の知識って所でご容赦、ご指摘・修正ください。

> > リアルタイム制御というのはコンピュータの中での計算の時間と
> >現実の時間とを一致させた制御です。
>
> 必ずしもそうでは無いと思います。
> 「一致する」といってもその判断基準が仕様で決まっていると
> 思うんですが、ある程度の幅があると思います。
> その幅の中に入るまで、目標値と計算値を比較、フィードバックを
> 繰り返して、ある時間以内に(これも仕様で決まる。)終わるような
> ものではないんでしょうか?

ま、そうですね。一致と言うよりは、出来るだけ高速に処理する制御方式(OS)でしょうか。

リアルタイム制御とは、各種外部からの要求に対して、それぞれの要求時間内に要求仕様の仕事を終了させることが要求される場合に、使用される方式(OS)で、特に、マイクロ秒くらいまでの高速な応答が必要とされる場所に使われます。これに対する他のOSの手法は、時分割処理、タイムシェアと呼ばれて、一般的なOSで使用されている手法です。(他にあるかも??)
例えば、SUNなどのUNIXとかのOSでは、各ユーザーの使用できるCPU時間を時分割で順次巡回させて、あたかも、各ユーザーがそれぞれ別のCPUを使ってるように作動させる手法が使われています。また、マルチユーザーでなくても、UNIXの中のいろんなプロセスを処理するときに、それぞれをスレッドに分け、それぞれを時分割で並行処理させるとか出来るようにもなっています。
たとえば、Ethernetの内部処理とか、HDに対するRW処理とか、RS232C通信とか、プリンタースプーラーとか。いろんな監視タスクとか、タイムアウト時間管理とか、・・・いろんなものが考えられますが、ま、この辺は、OSの作り方でいろいろ出来ますから・・・

もちろん、UNIXでも、OSのいろんな機能を実現するのにすべてを時分割で行っているわけではないと思います。


まず、コンピューターシステムで、いろんなことを実現するのに、一般的に以下の手法があります。(ご存じとは思いますが)
1・すべてを一本プログラムで作動するように作る。これは、初歩的な方法で、普通使われませんが、非常に小さいソフトでよい場合、使われたりします。例えばPICという1チップCPUなどでは時々使われると思います。(秋月通商でおなじみ)
2・ハードを追加してこれで行う。CPUが間に合わない場合とか、ものすごく高速処理が必要な場合。例えばGraphic処理なんかこれですね。
3・DMAを使用する。これが有効に使用出来る場所に使われる。例えばHDやEhternetなど高速通信が必要なもののRWデータ転送。
4・インタラプトというCPUに内蔵されている機構を使用する。これは、主プログラムと、割り込み処理プログラムを別に用意しておき、外部からの処理要求をインタラプト信号線でCPUに知らせ、CPUの機能であらかじめ登録されていたインタラプト処理ルーチンソフトを作動させるようにします。もちろん、中断された主プログラムの諸情報はsaveしておき、インタラプト処理ルーチンが終了したときに、これらを戻して主プログラムが影響なく処理を続行できるようになっています。
インタラプト処理の例は、例えば、RS232Cとかセントロ、SCSIやEthernetなどのコントローラーチップが処理終了したときとか、外部から信号がきてこれの処理依頼がある時などですね。
インタラプトだけでRS232Cなどの処理を作ることもできますし、バッファーにRWするところ迄などをインタラプトでやって、あとは、これの後処理を実行するタスクを作り、OSの監視下で実行させるとか。これで判ると思いますが、リアルタイムOSが無くてもインタラプトとか、ハードで実行とかで、高速処理は実現できます。でも、一般性が無く、サービサビリティが悪かったりとかで、リアルタイムOSが必要となるわけです。
5・タイムシェアOSで行う。もちろんインタラプト処理を使用し、後処理を、このOS管理下で実行させるわけですが、時分割ディスパッチ(ディスパッチ:タスクを切り替えること)では、他の処理をやってる間待たされますので非常に応答性が悪くなり、一般的にインタラプト処理内部で、高速処理部分は殆ど実行し、遅くて良い処理をスレッドに任すと言うことになると思います。ここで、時分割だけでなく、ディスパッチの優先度をタスクごとに高低で指定できるようなOSが出来てきます。また、同じプライオリティのタスク間の実行順は時分割と同じラウンドロビンでぐるぐる順次回します。ここまできても、実は、リアルタイムマルチタスクOSにはなっていません。根本的に違うのが、OSのカーネル部分でのインタラプト不可時間の短さです。
6・リアルタイム・マルチタスクOSを使用する。
これでは、タスクの実行優先度指定は当然内蔵します。で、OSカーネル部のインタラプト不可時間の最適化:最小化が必要になります。

OSがタスクをディスパッチするとき何をしているんでしょうか。
CPUはプログラムを実行中断され、再開するときに、どういうものがそろってなければならないのでしょうか。ソフトだけで実現できるのでしょうか。出来ないので、ハードが付いています。それがインタラプト処理ハードと、これ関連の命令、CPUの内部動作です。インタラプト処理は、主プログラムを中断し、再開できます。この機能をうまく使えばタスク・ディスパッチに利用できますね。こういうふうに発展してきて、現在では殆どすべてのCPUで、この間連の機能を内蔵しています。再開するためには、CPUの内部レジスターと各種フラグ、内部実行状態をすべて、saveし、外部などに書き出し、また、再開時にはこれらをすべて書き込み再開するようになっています。これを利用して、疑似平行に走らせたいプログラム群を管理する表を持ち、saveされたCPU内部情報を、ここに入れておき、実行させたいタスクを実行させるとき、ここの情報をCPUに書き込むことによって、そのプログラムを再開させるわけです。再開はソフト(OS)が動いてるときにソフトで実行しているわけですが、実行中のタスクを止めるのは誰がやるのでしょうか。これが、各種インタラプトです。時分割に利用されるのが、10msecなど一定時間ごとにインタラプトが起きるようにしてあるタイマーインタラプトです。各種I/O制御チップからのインタラプトもあります。これらインタラプトがあったらイアンタラプト処理の終了後OSに実行が移るようにしておけば、インタラプトごとにOSが動き、優先順位判定とか、ディスパッチとかを行えるわけです。
で、問題は、じゃあ、このCPUの内部情報をsave、restoreしているときは当然ですが、上記タスク情報をいじっているときとか、優先順位とか処理しているときに、次の別のインタラプトが入ってきたらどうなるでしょうか。困っちゃうわけです。フラグなどを見て、処理をどうするか決め、フラグセットとかの処理を実行し、選ばれたタスクを実行に移す、と言う処理の途中でまた、この処理を最初からやり始めるというわけで、めちゃくちゃになります。でこの間は「インタラプト不可時間」としておき、一段落したら「インタラプト可」となるようにします。
で、この「インタラプト不可時間」の間にインタラプトがきたら、この間の時間インタラプトの処理が実行されずに待たされます。すると、当初の目的の高速処理要求にあわなくなる場合が出てくるわけです。
で、リアルタイム・マルチタスクOSではこの「インタラプト不可時間」が、そのCPU上で最高になるように工夫されており、インタラプトから渡された後処理をタスクで実行するとき、このタスクの実行優先順位を他より上げてあれば、これが最優先でディスパッチされ、実行に移されます。で、応答時間を保証していたりします。てな具合で、与えられたCPU環境で、最速の処理を出来るようにまとめられたOSってーことです。もちろん、これ以外にも、タスク間通信とか、セマフォとか、event関連システムコールとか、いろんな機能を内蔵しています。

で、ITRONですが、上記リアルタイム・マルチタスクOSの一種です。東大の坂村先生の提唱されたTRONの工業用OSということで提唱され、各社がつくって認証を受けてITRONと名付けているんだと思います。昔見たのは日立が68000用に作ったITRONを外販し、本も市販されていました。この辺のOSの内容などは、CQ出版社だったか、猪飼邦夫さんだったかが、書いた単行本があり、私は参考にしていました。Z80用に簡単なOSを自作し内蔵させましょうと言う感じです。
私もこれを参考に作ったことがありますが、割と簡単です。(もちろん機能を非常に少なくしたから)68000用の大きなものも、友達が作っていました。数人月程度でしたが。
世の中には、RMM(RealTimeMultitask-Monitor)と言うものを売ってはいます。Intelでさえ、昔から、RMX86とか、あります。68K関係の生き残ってるOSとして、OS-9なんてのもありますが、これなんかリアルタイムOSでもあります。上記応答時間を保証しています。
もっといろいろ売ってますが、一個売るごとにライセンス料が必要で、ソースなんてすごく高い。で、内製したいけど仕様もすべて自分とこで作ると大変です。で、ITRONが出てきて、こりゃーいい!となったわけでしょう。CPUパワーが小さい場合、OSを最適化したくなります。このとき、ソースまで自分とこであれば、楽に改造できますね。で、家電用などの4~8BitCPUに使用されるOSがITRONになっていった?(本当かどうかは知らないが)のが、頷ける感じがします。

> >他に、最近ではITRON上のJava仮想マシンも出ました。
> >制御関連ではJavaへの移行が始まっているようです。

機器組み込みにも、GUIとWindowsアプリ、Windowsファイルシステムコンパチ環境が要求され初めて久しく、今では結構PC-Winが機器組み込みに使われています。
このとき、リアルタイム応答性は、Windowsに組み込むのは大変なので、外部にCPUを持たせ殆どの処理をそっちで行い、GUIとして、PC-Winを使っています。PCのCPUの方が圧倒的に早いんですが、Winにデバドラ作ったりするのが結構大変なので、これを必要最低限にし、PCの機種が変わっても、機器側は変わらないようにして組んでいるようです。
ITRONなどカーネルの上にCGI/GUIとして、Javaなどがはやれば非常に良いと思います。もちろん、ファイルシステムは、互換にして、ワープロや表計算など最低限の必須アプリが移植されて欲しいですが・・・(ユーザーが望む場合が多い)

> >自動車を例に取るとエンジンへの燃料の微妙な噴射などの制御をす
> >るとき、エンジンの回転の間に次の回転の計算を終えていなければ
> >いけないのです。

そうですね。

> 「次の計算」は予測で行うのですから、
> 微分方程式を解くことになりますよね?
> やっぱりその解には誤差がありますから、
> 上に書いたような処理をするのでは無いでしょうか?
> もっと画期的なアルゴリズムでもあるんでしょうか?

パソコンの場合、3Dレンダリングなどで判るように、処理速度が遅くてもユーザーは待ってくれる場合が殆どです。しかし、基本的に、機器組み込みの場合、間に合わなかったらそこまで仕様を落とすという方式は、対抗会社があり、ハードなどで実施している高速の機種などがある以上無理です。何らかの強化、対策を行って、要求仕様を満たそうとします。しかもコストは安くです。
で、アルゴリズムは、十分検討し、価値分析をし、本当にこの要求速度が必要なのか、この速度でこの要求制度が必要なのか、浮動小数点でなく固定小数点で計算できないのか?
など検討を重ね、あらかじめ計算して置いて、答えを表にして置いて、実時間実行時には計算せず表を引いて、そのまま使うか、保管計算くらいをIntegerで行うとか高速化のいろんな工夫をします。最悪時には、アセンブラレベルで最適化をしたり、ハードを追加したりのハードをも含めた最適化をします。
例えば、Log計算なんて、8bitCPUでは遅くて実行時計算なんてやってられませんが、表にしておき、保管計算すれば、Logだろうが、Lnだろうが出来るでしょう。
例えば定数kで割り算する場合は、あらかじめ256/kとか割り算して置いて、この結果の定数値を使って、実時間実行時に、かけ算し、その結果を8bit右シフトする事で256で割り、結果を得る。とかの方式があります。
ま、ようするに、画期的なアルゴリズムというよりは、地道な高速化を行うと言うことです。
機器組み込みに、Pentium内蔵の1チップCPUなんて、いまのとこ、あり得ないですから。

ま、でも、SHとか、RISCチップがエンベデッド市場に入ってきてますから、だんだん安くなって、こんな話なんて昔話になって行くんでしょうね。

・・・ちょっきんごめん・・・

 



いじょう、長話で、臍が茶をわかす話でした。

渡邊鼎 でした。
http://www.din.or.jp/~kwat/
kwat@din.or.jp

んじゃ!

渡邊鼎じゃった。


[Home] [Linkし放題] [Fleamarket]