マウスカーソルを動かすと、なぜWindows 95の動作が速くなるのか?

レトロなテーマのOSを題材にしたゲーム「Hypnospace Outlaw」をプレイしていました。このOSには、ウェブページを読み込むときに、マウスカーソルを小刻みに動かすと、ページの読み込みが速くなるという独特の動作があります。

それを見て、私はあることを思い出しました。私が若い頃、記憶が正しければ、Windows 95(98ではないにしても)には、プログラムをインストールするときに、マウスカーソルを小刻みに動かすと、進行が速くなるという奇妙な動作があった。何が原因なんだろう?ググってみましたが、関連するものは見つかりませんでした。

曖昧な説明で申し訳ありません。

これは、Windows 95がイベントを生成する方法に欠陥があることと、多くのアプリケーションがイベントドリブンであることが原因です。

Windows 95のアプリケーションは、非同期I/Oを使用することが多い。つまり、コピーなどのファイル操作を要求し、その操作が終了するまでスリープ状態にすることをOSに伝えるのである。スリープさせることで、ファイル操作が完了したかどうかを延々と聞いてCPU時間を浪費するのではなく、他のアプリケーションを実行させることができる。

理由ははっきりしないが、おそらくローエンドマシンでのパフォーマンスの問題から、Windows 95はI/O完了に関するメッセージを束ねて、それを処理するためにアプリケーションをすぐには起こさない傾向にある。しかし、ユーザーからの入力があった場合にはアプリケーションをウェイクアップさせ、応答性を維持します。

したがって、マウスを動かすと、アプリケーションはI/Oメッセージをより速く処理し、より速くインストールします。この効果は非常に顕著で、インストールに1時間かかるような大規模なアプリケーションでも、適切なマウス入力があれば15分に短縮できました。

解説 (16)

はい、実際に測定可能なスピードアップをもたらす効果があり、自由に再現することができます。

現代のマシンで、大きなファイルをメモ帳で開いてみてください。ウィンドウはフルスクリーンにしてはいけません。読み込まれたら、マウスを使ってすべてのテキストをマークします(キーボードでも動作しますが、より手作業が必要です)。ボタンを押したまま(マークしたまま)、マウスを下に動かすと、テキストがマークされ、スクロールします。ここで、マウスを動かしているときと動かしていないときのスクロール速度を比較してみてください。マシンにもよりますが、数倍の速さになります。

すごいでしょう?

この現象は、他の多くのプログラムでも確認できます。これは、Windowsの初期バージョンでのマルチタスクの仕組みに関係しています。ここでは、すべてがメッセージキューを中心に動いていました。マウスを動かすと、マウス操作のメッセージが殺到します。その結果、プログラムはより頻繁に起動し、(その構造にもよりますが)その都度、状態を更新し、再びメッセージループに入り、画面の更新に時間を割くことで、全体的に反応が速くなりました。これは、協調型スレッドの性質にもかかわらず、MSがWindowsをより反応の良いものにするために使用した方法の一端を示しています。

解説 (18)

NT以前のWindows(Windows 1,2,3,3.11,95,98)は協調型マルチタスクで、NT'の(2000,XP,Vista,7 & 10)はプリエンプティブ型マルチタスクでした。

協調型マルチタスクでは、フォアグラウンドのアプリは他のタスクに制御を譲らなければなりません。 そのため、フォアグラウンドのアプリが固まってしまうと、マシン全体がフリーズしてしまいました。

プリエンプティブ・マルチタスクでは、システムは通常、ハードウェア割り込み(通常はタイマー)で強制的に降伏させていました。

Windows 95では、キーボードとマウスが割り込みを発生させ、マウスを動かすと割り込みが発生し、OSがイベントキューを処理しました。 プリエンプティブなマルチタスクの一形態で、固定のタイマー割り込みの代わりに、自分がそれを行っていたのです。

OSは割り込みで画面の状態を更新してから、他のタスクの処理に入ります。画面が更新されることで、OSの処理が速くなったように見えます。

EDIT - 1/2正しい. Windows 3.1と同じシステム仮想マシン(VM)モデルを使用してWin16アプリケーションを実行するため、Win16アプリケーションをプリエンプティブにマルチタスクすることはできません。このため、Windows 95では、Win16アプリケーションを実行すると協調型マルチタスク環境に戻り、アプリケーションが実行されている間はCPUを独占的に制御することになる。そのため、Win16アプリケーションとWin32アプリケーションが混在したマルチタスク環境では、真のプリエンプティブ動作は不可能である。

解説 (5)