リアルタイム性能について

OSのバージョン

ここで報告するRT-Linuxのバージョンは0.6(Linux 2.0.33ベース)ですが1999年5月現在では次のようになっています。

プラットフォーム

この調査で使用したパソコンは、現在では陳腐化した感のあるデスクトップタイプのIBM PC/AT クローンです。

構成部品スペック
MPUAMD K6-2 300MHz
マザーボードIwill
主記憶128Mbyte
グラフィックボードMatrox Millenium 4Mbyte
ネットワークボード3COM 3C509
固定ディスク(E-IDE)3台 ※リアルタイムLinuxで使用したのはこのうち1台(約2Gbyte)
CD-ROM(E-IDE)1台
マウスPS/2
キーボード日本語106

MPU資源割り当て

/procは次のとおりです。

割り込み(IRQ)


	 0:    2025939   timer
	 1:       3072   keyboard
	 2:          0   cascade
	 6:         85 + floppy
	 8:          1 + rtc
	10:          0   3c509
	12:     338883   PS/2 Mouse
	13:          1   math error
	14:     657115 + ide0
	15:        441 + ide1

I/Oポート


	0000-001f : dma1
	0020-003f : pic1
	0040-005f : timer
	0060-006f : keyboard
	0070-007f : rtc
	0080-009f : dma page reg
	00a0-00bf : pic2
	00c0-00df : dma2
	00f0-00ff : npu
	0170-0177 : ide1
	01f0-01f7 : ide0
	0210-021f : 3c509
	02f8-02ff : serial(auto)
	0376-0376 : ide1
	0378-037f : lp
	03c0-03df : vga+
	03f0-03f5 : floppy
	03f6-03f6 : ide0
	03f7-03f7 : floppy DIR
	03f8-03ff : serial(auto)

DMA


	 2: floppy
	 4: cascade

テストプログラム

調査のために作成したテストプログラムはリアルタイム処理としてプリンターポートや、RS232Cポートからパルスを出力しそのパルス幅を制御しようというものです。このプログラムは種種のパラメータをWWWブラウザーのUIから設定できるようにしてあります。

注意:この画面でパラメータを設定しても今お使いのコンピュータには何も影響は与えません。

結果

プリンターポートや、RS232Cポートから出力されるパルス波をオシロスコープで測定することによって結果を得ました。

サンプルデータ
パルス周期:100μs
パルス幅:68μs
タスク優先度:4
負荷の種類:整数の加算
繰り返し回数:5000回
出力ポート:COM1

下のグラフで判るようにパルス周期や負荷の種類に関係なくパルス幅は繰り返し回数に対して直線的に変化します。

上のグラフの傾きを計算することによって1回当たりの処理時間を求めました。

負荷の種類1回当たりの処理時間(ナノ秒)
アイドリング7.0
NOP命令10.3
整数の加算13.7
浮動少数の加算47.2
浮動少数の積算49.7
1μs遅延(I/Oポートアクセス)1712

繰り返し負荷を与えている部分のアセンブルリストは次のとおりです。

<アイドリング>


	movl pk+12,%ebx
.L45:
	movl %ebx,%eax
	decl %ebx
	testl %eax,%eax
	jg .L47
	jmp .L46
	.align 16
.L47:
	jmp .L45
	.align 16
.L46:

<NOP命令>


	movl pk+12,%ebx
.L56:
	movl %ebx,%eax
	decl %ebx
	testl %eax,%eax
	jg .L58
	jmp .L57
	.align 16
.L58:
	NOP
	jmp .L56
	.align 16
.L57:

このリストから判るようにアイドリング処理時間は繰り返し回数カウンタの処理時間であります。一方、MPUのクロックサイクルは3.3ナノ秒で、NOP命令のクロックサイクルは1なので

NOP命令の処理時間 = アイドリング処理時間 + 3.3ナノ秒

になることが予測できます。また、先の測定結果もこれによく一致しています。従って、出力するパルス幅を制御することは可能であると言えます。

1μ秒の遅延はI/Oポート(0x80)への書き込みによって実現していますが何と700ナノ秒も余分に時間がかかっています。この原因は不明ですが、次の事が疑われます。

実用性についての考察

制御への応用を考えた場合、制御則演算のための浮動少数演算能力を把握しておく必要があります。今、通常のLinuxを動作させつつ1ミリ秒周期の制御をする事を想定すると、今回の環境では浮動少数積算が15000回程度実行できる事が判りました。この回数の処理するのに700μ秒であり30%の余裕を持っています。この余裕は次の理由によって必要です。

RT-Linuxはクロックを割り込み源としてユーザタスクをスケジュールします。通常のLinuxはユーザタスクといっしょに最も低い優先度でスケジューリングされますのであまりユーザタスクの負荷が重いと通常のLinuxがスケジューリングされず、ユーザータスクだけが実行されている状態になります。つまり、この状態では通常のLinuxそのものとそのアプリケーションプログラムは動作が停止してしまいます。これではLinuxは単なるローダーに過ぎずLinuxの長所を生かせないのでLinuxを使う意味が薄れてしまいます。

注意を要するのはLinuxの割り込みマスクによるリアルタイム処理が遅延される事です。パルス周期100μ秒でパルス幅を制御しようとした時、±10μ秒程度のスキューが観測されました。クロック割り込みは最も高い割り込み優先度を持つので割り込みマスクを掛けられること以外にリアルタイム処理のスケジューリング間隔が乱されることは考えられません。リアルタイム処理がない時間に通常のLinuxがスケジューリングされ、Linuxのカーネルもしくはドライバが動作するときに長い時間(今回の場合数10μ秒以上)割り込みマスクを掛けてしまう事が最も考えられる事です。実際に、fsckコマンドを発行して固定ディスクをアクセスしたり、マウスを移動させたときにこの現象が観測されました。従って、RT-Linuxをリアルタイム処理へ応用する場合は事前にこの遅延が許容できるかどうかを判断すべきです。