さて、より細かな周期の設定は原理をみれば明らかで、たとえば、1[ms]単位で設定したいときは、タイマ割り込みの周期を1[ms]に すればいいわけです。
実際の修正個所ですが、/usr/src/linux/include/asm/param.h
以上でカーネルの改造は終了です。カーネルを再構築して、lilo設定して再起動してください。 なお、モジュールの再構築・インストールはしたほうがいいでしょう。このHZに依存するモジュールがわりとあります。 そのままモジュールをインストールすると、いままでのと混じる心配がありますので、ご注意下さい。 環境によっては、Makefile の頭の EXTRAVERSION に "-1k" とでも書くと、標準と異なるディレクトリにインストールされ、区別されるようです。
いちど、問題なく日常生活がおくれることが確認されたら、そのままそれを主環境にしてしまってもいいとおもいます。 現に私は長いことそんなカーネルで生活していましたが不具合はありませんでした。 ちょっとはパフォーマンスが落ちているはずですが(その分は少しクロックを上げて...)。
なお、以後、「HZを1000にしたカーネル」といちいち言うのも面倒なので「1k-linux」(いちきろ りなっくす/りぬくす)と表記します。
このように、カーネルの定数を1つ変えただけで、普通の制御をするには十分な単周期で安定した実行が可能となります。
原理的にはHZを大きくしていけばより細かくなるはずですが、1000程度で留めておくことをおすすめします。
この先はどんどんパフォーマンスが低下し始めるはずですし、そもそも、そこまで細かくしても、この手法だとばらつきが大きくなりそうです。
もし、10k以上をねらうなら、やはり、RT-Linuxの導入を検討すべきでしょう。
結果を右図に示します。
まれに、図のように 1[ms]遅れることがありますが、基本的には6[ms]周期で実行されていることが確認できます。
ちなみに、cycleのデフォルトの15[ms]のままやると、16[ms]あたりになります。
優先度をあげるためには、1つのコマンド、2つの関数があります。
この設定の恐いところは、もし、プログラムが無限ループにはまったりしたときに、端末も動かないので kill すらできなくなります。
処理の重いプログラムを周期実行かした場合には大きな効果が得られるとおもわれますが、普段、それほどはっきりした効果がみられるわけでもないので(上の手法で十分なことが多かったです)、使ってみて効果がなさそうなら、使わない方がいいかもしれません。
なお、SCHED_FIFO と SCHED_RR の違いですが、同じ優先度のプロセスが2個あったときに、SCHED_FIFO は順に処理、SCHED_RR は時間を区切って交互に処理するようになるようです。
やり方は簡単で、常に画像処理をしているようなプロセスがあれば、それの優先度を下げてやります。
そういったものが特にない場合は、ダミーのプログラムをつくって低い優先度で実行することで効果がありますが、無駄にCPUを動かすくらいなら、世界的な分散処理の研究のお手伝いをするのも手です。
ここまでの方法が"尊敬語"にあたるなら、この方法は"謙譲語"にあたります(謎)。
以下に実例を示します。
以上のように基本的には複数の周期を設定し、かつそれらを精度良く実行したい場合は公約数を持たせるようにしましょう。
なお、デュアルCPUの場合には2つまでならうまく行きそうにおもえますが、残念ながらパフォーマンス向上のための仕掛けにより、うまい具合いには
なりませんでした。CPUが両方ともアイドリング(全プロセス休眠)の場合には期待通りの動作はしますが、そのような状態は期待しないほうが良いかとおもいます。
第一の例(左or上)では周期に公倍数を持つ 5,10 を設定しました。この場合、両者とも、精度良く周期的に実行されています。
それに対して第二の例では一方がひどいことになっています。
これは周期として、5,6 を設定したものですが、その結果衝突が起って、優先度を若干下げておいた周期6のプロセスの周期が乱れました。
この時のプロセスの実行の様子を詳細に分析したものを以下に示します。
第一の例は 3,6[ms]ですが、このとき、タイミングが一つずれることで、きれい噛み合って両者とも期待通りの周期で実行されています。
それに対して、もう一方の例では 4,5[ms]を指定しましたが、実行が連続して行われているところがあり、それによって平均周期も乱れています。