霜ネタに対するリミッターが弱くなってるよなー、と、最近よく思うのだけど、これが年をとるということかもしれない。 _
だからどうした。(今日は先に書いておく)一定周期で情報の勉強をちゃんとしたいなー、と思うのだけど、思うだけ。 _
Tyconって見るたびにタイ子さんが連想されるのだが。 _
http://labs.cybozu.co.jp/blog/mitsunari/2007/10/x86_1.html _
3-1,9,10あたりが挫折。 _
2は寝たら思い付いたがこれでええんか?3-2は少し調べた。4はどっかで読んだ。5,6,は少し調べた。7は自信無し。8はだいぶ調べた。9は一晩考えてわからんかった。10は見てもない。 _
ここ数週間くらいですごく毛が薄くなったような気がするのだけど気のせいだろうか。 _
3個くらい思い当たる原因があるので、なんとかする。 _
本当に減ってるかどうかわからんのが際どいな。プロファイラ的なものが必要。 _
TODO : ヘアプロファイラを書く。 _
書けるもんじゃない。 _
三連休の楽しみが三日伸ばしたヒゲを剃るとかなので終わってるというかなんでそんなに毛の話題ばっかり。 _
最近無駄な休日を過ごしたことについてしか書いてないのはいかがなものか。 _
/sys/block てなんで /sys/class/block にならないの…と思ったけど、あー、キャラクタデバイスとブロックデバイスで分けてんのかな。そうだとすれば納得いく。 _
とりあえずNetBSDを入れてみたんだが…何をするのんだったっけ。 _
あたりか…いつやるんだ。 _
みなさんげんきですかわたしは元気です。 _
なんかもうあかんな… _
_ デスマ
やってきた。4回くらいやって多分ラスボスらへん。最初見たときは「これダメなんじゃないか」と思ったけど、そうでもないな。稼ぎかた理解してジャラジャラできるようになれば良いかも。 _
それなりに近くにゲーセンがあるのがわかった。自転車で15分くらい。虫無印、ふたり、雷電4、デスマといったのがあって僕としては非常に良い。 _
なんという素晴らしい継続力だろうか! _
_ 自作OSでリアルタイム性が重要である理由
反省して長めの文でも書く。OSが書きたくなったときはリアルタイム性について考えることによって罪悪感が薄れる、という話。 _
たまにOSが書きたくなる。 _
まだ一行も書いたことないけど。色々とやりたいことはあるのだけど、別に無くても困らないし… _
まあ、とにかく、色々とやりたいネタがある。のだけど、しかし、結局のところどれもこれもわざわざOSとして作らなくてもSmalltalk的解決方法で、ほぎゃーっと既存のOSの上で閉じた環境作ればそれで十分な範囲のネタなんだよな。MMUとか欲しくなったとしても、kvmがあればどうにでもなるし。 _
わざわざOSスクラッチしてまでやらないといけないことってあんまり無いのだよな。 _
LinuxやWindows相当のものですら、QEMUやらVMWareなどのように既存のOSの上で動く閉じた環境として実装できるわけで、つまり、Linux相当のものを実装したくなった場合でさえ、それをOSとして実装するメリットは全く無いのである。 _
さて、で、OSを実装してるときに、「それってわざわざOSとして実装する必要あんの?」と聞かれたときに、どう答えるか、という問題である。 _
「新しいデバイスが欲しくなって」→「Linuxのドライバ書けば?」 _
「今のOSはメモリやCPUパワーを使いすぎだ!」→「新しいマシン買えば?Linuxで環境選べば?」 _
「ファイルシステムを革新したくて…」→「FUSE使えば?Smalltalk的解決で問題あるの?」 _
「黙れ!批判しかしないこの老害が!」→「何言ってんだゆとり世代が!」 _
そんなときのために、OSを自作するときは、常に常にリアルタイム性を意識し続けるのである。リアルタイム性というのは、一番下のレイヤから一番てっぺんのレイヤまで一貫して設計されないと実現されない性質である。もし、中間にひとつでもリアルタイム性を維持できないレイヤがあればそれで破綻してしまう。既存のOSの上で動くシステムでは決して実現できない性質である。 _
OSを作るときは常にリアルタイム性を意識しよう。「そのOSの長所は?」と聞かれたときは常に「リアルタイム処理を実現できます」と答えよう。これでありとあらゆる「既存のOSと何が違うの?」という質問に正々堂々胸を張って答えられるのである。 _
また、リアルタイム性を維持する方法を考えるのは、それなりにおもしろい話題であると思う。リアルタイム性が要求された瞬間に、既存の「1割の状況を切り捨てることによって9割の場合で大体うまくいく」ヌルい技術、よーするに、スワップ、GC、プリエンプションありのスケジューラ、などは全て滅びることになる。(そんなOSを一体誰が望んでいるというのか!) _
バランスよくトレードオフを選択するなんていうことは許されない!状況を的確に分析し、必要な物、必要で無い物を選択し、常に最適な方法を選び続けなければならないのだ! _
_ リアルタイム性を維持するには
OK。さて、どうすれば一番低レベルなレイヤからてっぺんまで一貫してリアルタイム性を維持できるだろうか。 _
もちろんここで、「ドライバの仕様を一切決めないことによってリアルタイム性を維持する」というITRON的回答(よーするに全部お前らでなんとかしろということだ!)もあるが、まあ、それはおいといて、デスクトップOSのように、それなりに色んなデバイスも扱えることを前提としてリアルタイム性をどうやって維持するかについて考えよう。 _
もちろんここでそれを考えるのは僕の仕事ではなくここを読んでいるみんなの仕事だ! _
(なお、以下では「リアルタイム実行が不可能であることを検出できる」「時間内に処理できなかった場合を時間内に検出できる」あたりが実現できてればリアルタイム性が維持できているものとしている。そういうのはリアルタイム性を維持できたとはいわない) _
1. 基本 _
スワップもプリエンプションも無い世界というのも辛いので、そういうのを許す「非リアルタイムタスク」と、途中でプリエンプションしないが、制約の多い(デバイス、ファイルへアクセスできない、アクセスできるメモリ領域が小さいなど)「リアルタイムタスク」とに分ける。「非リアルタイムタスク」は既存OSのタスクと同じでよい。 _
2. リアルタイムタスク _
リアルタイムタスクを作るときは、「開始から終了までの時間の予想最悪値」「いつまでに終わらせるべきか」「例外処理ハンドラ」「例外処理ハンドラの処理時間最悪値」「例外が発生してから終了までに許される時間」をパラメータとして渡す。 _
err_t create_rt_task( program_t program, time_t process_time, time_t must_finish_before, excpt_handler_t exp, time_t exept_proc_time, time_t except_finish_must_before )
OSの状態的にどう見てもmust_finish_beforeまでに終わりそうにない場合はエラー返す。渡したタスクが予想時間内に終わらなかった場合このタスクを作ったタスクに例外が投げられる。 _
3. 割り込み _
マルチコアシステムだった場合は割り込み処理するのとリアルタイムタスクを処理するCPUを分ける。コア一個だった場合はどうしようか。 _
register_irq_handlerに、「割り込み処理に必要な時間最悪値」「割り込みが発生する間隔の最低値」「例外処理ハンドラ」「例外処理の時間最悪値」「ハンドラが登録されるまでに許される時間」を渡す。 _
register_irq_handler( handler_t hdl, time_t proc_time, time_t interval, excpt_handler_t exp, time_t exept_proc_time, time_t except_finish_must_before, time_t must_register_before )
これに従って、「何ms処理すると何回割り込みが入って割り込み処理時間が最悪どのくらい」というのが取得できるAPIをつくる。 _
time_t calc_irq_handler_time( time_t process_time );
「割り込み優先度」はタスクキューの状態と割り込みハンドラの登録状態をみてOSが動的に割り当てる。 _
こうすることで、他の行儀悪いタスクのせいでシステム全体のリアルタイム性が損なわれる、ということは無くなるはず。リアルタイム性もメモリ等と同様のシステムの資源のひとつとして、OSの管理下に置ける、というわけだ。 _
(もちろんそんなことはない。例えば、SMTなアーキテクチャで片スレッドがキャッシュを洗い続けたらどうなるか。) _
別になんていうことはない、基本は、常に「自分がどのくらい処理時間がかかるか、どのぐらいまでに処理を終えたいか」を伝え続ける、というだけである。もちろん、そんな面倒なシステムは誰も使わないのだが。 _
というのは全体的に嘘で、リアルタイム性というのは、そんなに簡単に維持できるものでもなく、ハードウェアも含めたシステム全体で考えないとどうにもならないのである。例えば、本当にリアルタイム性が必要な場面ではHDDアクセスやネットワーク等I/Oも含めてリアルタイム性を実現しないといけないだろう(全然知らんが)。そうなってくると、…えーと、どうなるの? _