Time Sharing Systemの幻想

そう、あれは中学生ぐらいの時でした。
パソコンの世界しか知らなかった私が、近くの日立のコンピュータのショールームに遊びに行ったとき、ワークステーション2020を初めて見たときの衝撃ったら無かったです。「これが噂に聞くマルチウィンドウか!」「マルチウィンドウの中で、複数のプログラムが同時に動いてる!」「パソコン雑誌に載っていたTime Sharing Systemって、これのことか!」
パソコン少年だった私としては、AX互換機のB16なんかよりもずっと衝撃的でした。B16は、これはこれでおもしろかったですが。Turbo Pascalとか使わせてもらったんだよね。懐かしい。


で、興奮冷めやらぬまま、何とか手元のMZ-700でこれを実現できないかと考えました。8253による割り込みベクタをうまく使えばタスクを直前の状態で保持することは可能だし、割り込み直後にDIをかけて、全レジスタと裏レジスタを一気にPUSHしてから、それが「どのタスクのレジスタなのか」を元にTCBにレジスタをコピーすることはできるはずです。で、TCBから次のタスクのレジスタを復帰させて、最後にPCをPUSHしてRETI。当時、IOCSコールなんか重くて使ってられませんでしたので、スレッドセーフじゃないルーチンを使って入出力することなんかありませんでしたし、入力はポーリング経由でしかしませんでしたから、入力による割り込みも、イベント駆動も行いませんでした。スタックポインタも、タスクごとに持つ必要性を感じなかったので(ようは、ローカル変数という考え方がなかった)1本のスタックでまかなっていました。
なんか、微妙にキーを取りこぼしがちな傾向はありましたが(そりゃ、ポーリングじゃねぇ)、マルチタスクなOSは何とか完成を見せ、タスクごとに表示位置を変えてマルチウィンドウ風味にしました(オーバーラップはできなかったけど)。
ところが、ですよ。
複数のタスクが同時に動いている状態は作れたのですが、当たり前ですが同じプログラムをシングルタスクで動かすのに比べて圧倒的に重いのです。2つ動かすと2倍の時間が、3つ動かすと3倍の時間がかかります。はじめはタスクスイッチにかかるオーバーヘッドを疑っていましたが、タスクスイッチの頻度を長くしてもたいした違いはありません。当時TSSに幻想を抱いていた私は、マルチタスクにすると、CPUパワーも2倍、3倍になると錯覚していたのでした。
そんな訳がない、というのに気づいたのは、だいぶたってからでした。有限のCPU時間を共有してれば、そりゃ遅くもなりますわな。


と、いうわけで、マルチタスクの幻想からさめた私は、

  • ゲーム本体はVSYNC割り込みの間だけ
  • 残ったCPUパワーはPWMによる音声再生に専念

という変なプログラムを作っては一人で悦に入っていたのでした。当時、キャリーラボの佐々木さん(現・アルファシステム社長)がワンショットPCMをつかって和音再生をしたり、デューティ比を変えて音量調節したりしていたので、BGMは同じ方法論で和音を鳴らし、ゲーム本体は割り込みの一瞬だけというある意味すごいプログラムでした。PSGがついてたらこんなことしないですんだんでしょうけどね。ゲーム自体は垂直帰線区間内に収まりきるというのも、MZ-700の画面描画の早さのたまものでした。
データレコーダーから1bitPCMがとれることが判ってからは、データレコーダーからの音をループしたり(サンダーフォースのまねです。はい)1bitPCMでも、実はデータがかなりでかくなることが判って悩んだり、楽しかったなぁ。
あの技術を応用すれば、メガドライブZ80だけでFM+PSG+PCMというすごい音源ドライバが作れたかもしれませんが、あのころはメガドラはただの消費者だったからなぁ。今ならメガドラのハードに詳しくなったけど、じゃあ、今作っても誰も喜ばないだろうし。
ともあれ、TSSという幻想は、現代のSMPの時代でやっと意味をなしてくるのでした。もっとも、Core i7(4コア8スレッド)をうまく使い切るOSなんか見当もつきませんので、Unix like OSやWindowsNTカーネルにおんぶにだっこになっちゃいますけど。
もう一度、SMP向けのITRONの仕様を見てみるかなー。SuperH向けにリアルタイムOS作ると需要有るかなぁ。NintendoDS向けにARM7とARM9によしなにスレッドを割り振るOSが有ると便利・・でもないか。DSのボトルネックはメモリと出力だから、CPUはあまり気味になるな。
あー、OS作りたいなー。