新しい技術には常に利点と欠点がある。困ったことに,利点と欠点の重要性は時代によって変化する。今回は,Windowsの重要な技術メモリー管理とマルチタスクについて,それぞれの技術の利点と欠点を振り返ってみよう。

 前回は,セグメント方式のメモリー管理について紹介した。もちろん,セグメント方式の採用を決定したのはマイクロソフトではなくインテルである。もし80286がページング方式を採用していたら,Windowsも最初からページングを採用したに違いない。

 では,インテルはなぜページング方式ではなくセグメント方式を採用したのだろうか。セグメント方式の方がメモリーの無駄が少ないから?もしかしたらそうかもしれない。しかし,それ以上に重要なことは,大成功した8ビットCPUである8080との互換性だったと思う。実際には,8086と8080にはバイナリ命令レベルでの互換性はない。しかし,アセンブリ言語命令(ニーモニック)レベルでの互換性は保たれている。そのため,多くのアプリケーションが容易に8086に移行できた。

 ただし,8086アーキテクチャでは,多数のセグメントを同時に扱うことは困難であった。時代が進み,アプリケーションが巨大化すると,セグメント方式の欠点が問題になってきた。インテルはそれに応え,i386でページング方式を実装した。i386ではセグメント方式も使用できたが,もはやセグメント方式を使う理由は残っていなかった。アセンブリ言語を使う開発者が減り,ニーモニック・レベルの互換性を保つ必要はなくなったからだ。また,ページング方式の方が管理は単純であった。メモリーの使用効率は多少悪くなるが,メモリーは十分に安くなり,多少の無駄は許容されるようになった。

 もう1つ例を挙げよう。Windows 3.1では「協調型」あるいは「ノンプリエンプティブ」と呼ばれるマルチタスク方式を採用していた。これは,プログラムが明示的な待ち状態に移行した時点で,別のプログラムに制御を移す方式である。ノンプリエンプティブ方式は,OSの負担が軽く,Windows 3.1の他,Macintosh OSなどに採用された(もちろんMacintoshの方が先であるが)。ノンプリエンプティブなマルチタスク方式は効率が悪いと思っている人もいるようだが,そうではない。すべてのアプリケーションが正しく動いている場合は,Windows 95以降で使われているプリエンプティブなマルチタスク方式よりも効率がよい。高性能ファイル・サーバーとして一斉を風靡したNetWare Serverにも採用されていたくらいである。

 Windowsがプリエンプティブなマルチタスク方式に移行したのは,正しく動かないプログラムが増えたからだろう。ノンプリエンプティブなマルチタスクでは,1つのプログラムで無限ループに入ると,OSを含めた全プログラムの動作が停止する。アプリケーションの数が増えてくると,中にはいい加減なものもある。そういうとき,OSが強制的にCPU使用権を奪えるプリエンプティブなマルチタスク方式が有利である。OSの仕事は増えるが,CPUパワーは十分にあり,OSが利用可能なメモリー量も増えた。プリエンプティブなマルチタスク方式が持つ欠点は問題にならなくなったのである。

 技術にはすべて利点と欠点がある。そして,その重要性は時代によって変化する。エンジニアとして,このことは忘れてはならないと思う。