フロッピーディスクのフォーマット時にWindows 95がフリーズしたのはなぜですか?

レイモンド・チェンは有名なジョークに答えます:

-お父さん、どのWindowsがマルチタスクかを教えてください!

-さて、息子、フロッピーディスクをフォーマットするだけです...


誰が一日中ディスケットをフォーマットしますか? 多くのオタクはこれで忙しいだけであることがわかります。 (実際には、すでにフォーマットされたフロッピーディスクを購入できますが、ただ!)フロッピーディスクをフォーマットするときにWindows 95がハングするのはなぜですか?



MS-DOSとの互換性がすべてです。



少し前に見たように 、Windows 95のMS-DOSは古い16ビットドライバーのレイヤーとして機能しました。 I / O操作は32ビットファイルサブシステムによって処理されたという事実にもかかわらず、それらはすべて16ビットコードを通過したため、16ビットドライバー、 TSR、および同様のプロセッサーは「通常の16ビット操作」を認識し、通常の方法で動作しましたに囲まれています。



16ビットの世界では、13hソフトウェア割り込みがフォーマットに関与しており、多くのプログラムがフロッピーディスクをフォーマットするときに制御を得るために割り込みをインターセプトすることでこの事実を使用していました。 一部のTSRバックアッププログラムはこれを行いました(Windows 3.0用に開発されたバックアッププログラムには、ディスク操作を監視するためのVxDと呼ばれるWindows 3.x用の32ビットドライバが含まれていました)。 しかし、これはすべてを説明するものではありません。 最終的に、Windows 95は、ディスクのフォーマットだけでなく、 すべてのディスクI / Oを16ビットコードで駆動しました。 フロッピーディスクのフォーマットがシステムに大きな影響を与えたのはなぜですか?



上記のリンクの記事で述べたように、32ビットファイルサブシステムは慎重に証拠を偽造し、16ビットコードにMS-DOSがすべての原因であると信じさせましたが、これは事実ではありませんでした。 TSRプログラミングに関与していた人(すごい、TSRプログラミングに関与した人の定義はかつて多くの人々を対象としており、今日では数十人の経験豊富なプログラマーを説明しています。 MS-DOSは、I / O要求の処理中にこのフラグを設定しました。 MS-DOSはそれ自体へのネストされた呼び出しを許可しなかったため、TSRはこのフラグを注意深く監視して、MS-DOSにアクセスしても安全かどうかを知る必要がありました。 INDOSフラグはエンティティの16ビットの反映であり、32ビットカーネルはこれをメインクリティカルセクションと呼びました。 32ビットカーネルは、メインのクリティカルセクションとINDOSフラグを同じ状態に保ち、同じMS-DOSまたはTSRドライバーを数回並行して呼び出さないようにしました。 1つの仮想マシンが主要なクリティカルセクションをキャプチャすると、同じことを試みた他の仮想マシンは、最初の仮想マシンがセクションを解放するまで強制的に待機しました。 したがって、ドライバーまたはTSRへの並列呼び出しはブロックされました。



既に述べたように、16ビットの世界では、ROM BIOS自体がフォーマットに関与しており、互換性のために、フロッピーディスクのフォーマットは13ビット16ビット割り込みを介して送信され、すべてのTSRとドライバーが何が起こっているかを見ることができました。 多くのBIOSはおかしいので、ディスクのフォーマットを要求するとき、32ビットカーネルは多くの余分な作業を行い、BIOSが必要な環境を正確に取得できるようにしました。 特に、BIOSが完全に制御する仮想マシンのマネージャーから渡されるハードウェアタイマーのポートは、ランタイムが重要な遅延をフォーマットするためにBIOSが使用するサイクルの動作に影響を与えません。



それでは、合計ダメージを計算しましょう。 フロッピーディスクがフォーマットされている間、タイマーはBIOSが遅延に使用するサイクルの精度のために仮想化されます。 フロッピーディスクをフォーマットする仮想マシンのみがタイマーから信号を受け取ります。 残りは待つ必要があります。 タイマー信号が存在しないということは、「別のスレッドを動作させる時間です」というメッセージでスケジューラーを呼び出していないことを意味します。 さらに、主要なクリティカルセクションは、操作中はロックされます。つまり、他のスレッドはI / O操作を開始できません。 これはすべて、ディスケットが低速のデバイスであり、ディスケットの動作が完了するのを待機している操作が停止して数秒待機する必要があるという事実によってさらに悪化します。



少なくとも、フロッピーディスクは一度にトラックに沿ってフォーマットされ、フォーマット中はシステムがブロックされないのは良いことです。 BIOSは1つのトラックをフォーマットするように指示し、プロセスの終了時にタイマーが通常の状態に戻り(スケジューラーがジョブを実行できるようになります)、主要なクリティカルセクションのロックが解除されます(および保留中のI / O操作を実行する機会が得られます)。 しかし、その後FORMAT.COMプログラムは次のトラックを返し、フォーマットし、システムは待機状態に戻ります。BIOSの動作を妨げません



32ビットファイルサブシステムの場合と同様に、最後にフォーマット操作をインターセプトしようとする32ビットフロッピードライバーがありました。 これがうまくいった場合、ドライバーはBIOSの代わりに1つのトラックをフォーマットする仕事をしました。 勇敢な試みですが、ドライバーがいくら高くても関係ありません。 トラックのフォーマット速度は、主にフロッピーディスクの仕組みによって制限されます。



もちろん、Windows 95が16ビットドライバー、TSRおよび疑わしいBIOSとの互換性をサポートしない場合、タイマーとメインクリティカルセクションによる不条理な操作に気を取られることなく、32ビットフロッピードライバーに直接フォーマット要求を送信できます。 しかし実際には、16ビットドライバー、TSR、独自の32ビットVxDドライバーと疑わしいBIOSを備えた16ビットWindowsプログラムとの互換性を拒否するシステムが既にありました。 Windows NTと呼ばれていました。



Windows NTが必要な場合は、どこにあるか知っていました。



All Articles