開発:スケジューラを作ろうと思います。
社長:まあ、時間の管理は全ての基本ですからね。
開発:システムを管理したり何したりするにも、時間の記録と、時間に応じたアクションを管理することが重要です。ですが、たとえば cron では分単位でしかアクションを制御できないので、話にならないわけです。50年前の遺物と言えます。
管理:最低でも秒単位、できればミリ秒単位ですね。
開発:性能を測ったりする上では、ミリ秒の精度では足りないのは明らかです。ですがUnixやWindowsでのユーザ向けプログラムならマイクロ秒はかなり十分です。で、ちょっとプログラムを書きかけたのですが、以前からマイクロ秒を扱うシステムの関数のデータ構造が統一されていないのが嫌な気分なわけです。ならいっそナノ秒にということに。
開発:nanosleep()という関数は、Linunx にも MacOSに互換なものとしてある上、これ、シグナルの処理ともセットになっているので、効率も使い勝手も良いと思います。
社長:おっと、1993にはもう存在したということですか… 私がDeleGateを作り始めた時にはもうあったんですね。
開発:コマンドセット的には、time と date のナノ秒版である ntime と ndate。あとスケジューラとしての nschedかと思います。
基盤:ログを眺めるのに tail -f コマンドをよく使うのですが、あれのタイムスタンプ付き版も欲しいですね。
社長:私は cat というか tee コマンドのタイムスタンプ付き版をDeleGateの中で使ってましたね。
開発:つまり tail -f と cat と tee を統合してタイムスタンプを付けるコマンドですね。
社長:複数のファイルを見張って tail -f してマージしてくれるのも良いですね。
開発:tee の fan out に対して fan in というわけですね。それはまあ、shell でマルチプロセスにすれば出来なくもないですが、一つのプロセスにしたほうが効率が良いですね。というかどうせファイルディスクリプタをselectするだけだから、どこかにソケットをつなげて受信しても良い。popenでも良いかもですね。コマンド引数的には、-i ifile1 -i ifile2 -i iprogram -o ofile1 -o ofile2 -o oprogram 的な。
社長:要は URL を書けばよいのかなと思いますね。あと -o に加えて -a とか。ていうかコレ、実装は要するにプロキシサーバみたいなものになりますね。
基盤:なら、入力と出力を同じソケットにつなげてサーバとかクライアントにしてしまうとか。
社長:まあ変換サーバですね。そういえばそもそも、昔の inetd に登録するプログラムってだいたいそういうものでした。今で言えば CGI プログラムみたいな。
開発:出力がマルチキャスト的になると、どこかの受信者が滞ると全体がフリーズしてしまう危険はあります。となると出力にもタイムアウトを付けないといけない。
社長:fan in をマージして一つのファイルなりプロセスに渡す場合、どこから来たデータかにタグを付ける必要もあるでしょうね。
開発:そういえば、SSDとか想定するなら、CPUがネックになる場合、たとえば 並列 find + grep できると高速化できるのにと思います。
社長:どこからきたどういうコンテンツのデータはどこへ送るとか書けると、ルータになりますね。リフレクタにもなりそう。
開発:入力をパターンマッチして変換できると便利ですね。sed を通すとか?
社長:バスみたいですね。viabusもそんな感じでした。
基盤:だんだんスケジューラじゃなくなって来たような…
社長:スケジューラは、時間という入力を得て自分がデータを発信するんだと思います。順々に処理を実行するとか。データじゃなくてシグナルでも良いかな。となると送り先はプロセスですね。
開発:入力の仕様、変換の仕様、出力の仕様をそれぞれに書いて、結線する感じですね。それぞれオートマトンでも良いですが、メモリに余裕があればスレッドにしてしまうのが良いですかね。
基盤:1スレッドに1MBあげても、1000スレッドで1GBですから、今どきのコンピュータなら楽勝ですね。
社長:プロセスにするかスレッドにするかオートマトンにするかは、処理内容によって選択するんでしょうね。プロセス単位であればいわゆるコマンドshellによるプログラム組み合わせ機能になります。
社長:入力部分は言語処理系になりますね。正規表現だけだと弱いので、LL1くらいは入れたい。BNFで記述する。うーん、ついに学生時代まで戻りました(笑)
開発:学生時代に自分で書いたプログラムの発掘なら、知財とか著作権の問題が無くて良いですね(^-^)
社長:スケジューリングのタイミングの指定ですが、時刻表示のワイルドカード的なものが直感的で良いですね。2020-08-02/02:00:00.000 とか、*-*-*/00:00:00 とか、*-*-*/0,6,12,18:00:00:00.000 とか、*-*-*/*:*:00.000 とか。
基盤:IPv6アドレスの省略形みたいのが書きやすいですね。
開発:日付と時刻の間の区切り記号というのが悩ましいところですね。あれは標準があったはずなので、それに従うと良いのだとは思いますが。
開発:ところで今、nanosleepの時間精度をいろんなマシンで観察しているのですが、かなり面白い状況です。他の負荷が高い時に遅れるのは仕方がないとして、スカスカの時にどのくらいの精度があるかなのですが。
開発:ざっくり言って、Unixでも数ミリ秒程度の精度はあるように見えます。ガラ空きの当社アマゾンセール印度支局のAmazon Linuxなんて、数マイクロ秒のふらつきしかないですね。
開発:一方そこそこ仕事をしている東京本部では、時々大きく遅延します。といっても10ミリ秒程度ですが。
開発:通常利用中のMacMiniでも数ミリ秒程度のふらつきです。
開発:何もしてないParallels上のUbuntu 18.04でふらつきが大きいのは、ホストのiMacが何やら色々仕事をしてるからかも知れません。
開発:同じく暇人なHyper/V上のUbuntu 18.04ではふらつきは小さい。0.2ms以下です。これはホストのLenovo自体が暇だからかも知れません。
開発:暇人の最たるものと言えばラズパイ4です。なんといっても組み込み系ですし、さぞやと思ったのですが、それほどでもありませんでした。
社長:プロセスのプライオリティを上げてやるとどうなりますかね?
開発:nice とか使うの、何十年ぶりですかねぇw。sudo nice -20 !
社長:かなり改善はしますね。というかこれ、メモリ空間の中にSysTickレジスタが見えているはずだから、1ms前になったらビジーループでSysTickを観察したりとかすれば、1マイクロ秒より高い精度でスケジュールできるでしょうね。本当のnanosleepができる。
開発:ところで、いつの頃からかラズパイにつながらなくなったなーと思っていたのですが、Etherケーブルが抜けていました。
基盤:物理層の法則ですね。
開発:同じARM LinuxのよしみでQNAPでも動かないかなーとバイナリを持っていきましたが、だめでした。なんというか、実行形式として認識しないようになっているといいますか。
基盤:QNAPは Cortex-A53ですね… ラズパイだと Pi4 は A72 ですが、Rapsberry Pi 3 が Cortex-A53だそうですが。
開発:おおっと、そうですか。A72とA53でバイナリに互換性が無いんですかねー… Mシリーズとか全部互換なんですが。あああれも下位互換ていうだけですね。何にしても実行形式として認知してくれないって、動的ライブラリの関係のような気もするんですが。なにせQちゃんはデバッグ系の機能を全部落としてますから、追えないというか… static link にしてみますかね…
社長:認知されましたね。
開発:てことは、ラズパイ3のバイナリなら動く可能性がありますね。
基盤:ラズパイ3て結構高いんですよね。アマゾンで一番安いところが5200円くらい… まあ、オークションとかでならただ同然かもですが。
基盤:あ、pi 3 A+ 3,300円でありますね。Etherは無いですが無線LANあり。
社長:承認。
開発:早晩QNAPもA72版を出すでしょうけどね… 2万円を維持してくれるかどうかはわかりませんが、ラズパイだって価格は 3 と 4 で変わらないわけだし…
社長:ブラウザのウィンドウとかタブとか、やってる内容ごとにスケジューリングと言うか、少なくとも優先度は変えたいですね。メモリもコンパクションするか否かとか。
社長:それはそうと、わたしはこの、おいしい牛乳パックの注ぎ口のキャップに、テコの原理が採用されたことに、非常に感動しています。目からうろこというか。ぐび。
基盤:ヒトにやさしい技術の使われ方ですね。
-- 2020-0801 SatoxITS