DOS がシングルタスクである場合、古いバージョンの Windows ではどのようにしてマルチタスクが可能だったのでしょうか?

DOS がシングルタスクである場合、古いバージョンの Windows ではどのようにしてマルチタスクが可能だったのでしょうか?

DOS はシングルタスク OS だと読みました。

しかし、古いバージョンの Windows (Windows 95 も含む) が DOS のラッパーに過ぎなかったとしたら、Windows はどのようにしてマルチタスク OS として実行できるのでしょうか?

答え1

ウィンドウズ95

ウィンドウズ95MS-DOSの単なるラッパー以上のものであったレイモンド・チェンの言葉を引用します。

MS-DOS は Windows 95 で 2 つの目的を果たしました。

  • ブートローダーとして機能しました。
  • これは 16 ビットのレガシー デバイス ドライバー レイヤーとして機能しました。

Windows 95 は、実際には MS-DOS のほぼすべてをフック/オーバーライドし、それを互換性レイヤーとして維持しながら、すべての面倒な作業を Windows 95 自身で実行しました。また、32 ビット プログラム用のプリエンプティブ マルチタスクも実装しました。


Windows 95以前

Windows 3.x およびそれ以前のバージョンは、ほとんどが 16 ビット (16 と 32 を橋渡しする一種の互換性レイヤーである Win32s を除くが、ここでは無視します) であり、DOS への依存度が高く、協調型マルチタスクのみを使用していました。これは、実行中のプログラムを強制的に切り替えないマルチタスクです。実行中のプログラムが制御を譲るのを待ちます (基本的に、待機中の次のプログラムを実行するように OS に指示することで、「完了しました」と伝えます)。

マルチタスクは、MacOS の古いバージョンと同様に協調的でした (ただし、プリエンプティブ マルチタスクを誇っていた Multitasking DOS 4.x とは異なります)。タスクは、別のタスクをスケジュールするために OS に譲歩する必要がありました。譲歩は、特定の API 呼び出し、特にメッセージ処理に組み込まれていました。タスクがメッセージをタイムリーに処理している限り、すべて順調でした。タスクがメッセージの処理を停止し、何らかの処理ループの実行でビジー状態になると、マルチタスクは機能しなくなります。

Windows 3.x アーキテクチャ

初期の Windows プログラムがどのように制御権を譲渡するかについては、次のとおりです。

Windows 3.1 は協調型マルチタスクを使用します。つまり、実行中の各アプリケーションは、定期的にメッセージ キューをチェックして、他のアプリケーションが CPU の使用を要求しているかどうかを調べ、要求している場合はそのアプリケーションに制御を譲るように指示されます。ただし、多くの Windows 3.1 アプリケーションは、メッセージ キューをめったにチェックしないか、まったくチェックせず、必要な時間だけ CPU の制御を独占します。Windows 95 のようなプリエンプティブ マルチタスク システムは、実行中のアプリケーションから CPU 制御を取り上げ、システムのニーズに基づいて優先度の高いアプリケーションに CPU 制御を分配します。

ソース

DOS が認識するのは、実行中のアプリケーション (Windows または他のアプリケーション) のみであり、終了せずに制御を渡すことになります。理論的には、リアルタイム クロックとハードウェア割り込みを使用してスケジューラに制御を強制的に渡すことで、DOS 上でプリエンプティブ マルチタスクを実装することは可能です。トニーのコメントこれは実際には、DOS 上で実行されるいくつかの OS によって実行されました。

386 拡張モード?

注: いくつかのコメントがありました386 拡張モードWindows 3.x は 32 ビットであり、プリエンプティブ マルチタスクをサポートしています。

これは興味深いケースです。リンクを要約するとブログ投稿386 拡張モードは基本的に 32 ビット ハイパーバイザーであり、仮想マシンを実行します。これらの仮想マシンの 1 つでは、上記のすべての機能を実行する Windows 3.x 標準モードが実行されました。

MS-DOS もこれらの仮想マシン内で実行され、明らかにプリエンプティブにマルチタスク化されていました。そのため、386 拡張モード ハイパーバイザーは仮想マシン (1 つは通常の 3.x を実行し、他の仮想マシンは MS-DOS を実行) 間で CPU タイム スライスを共有し、各 VM は独自の処理を実行します。3.x は協調的にマルチタスクを実行し、MS-DOS はシングルタスクになります。


MS-DOS

DOS自体は紙の上ではシングルタスクだったが、TSSR についてハードウェア割り込みによってトリガーされるまでバックグラウンドで実行されるプログラム。真のマルチタスクからは程遠いですが、完全なシングルタスクでもありません。


ビットの話ばかりですが、マルチタスクについて質問しました。

厳密に言えば、ビット数とマルチタスクは相互に依存していません。任意のビット数で任意のマルチタスク モードを実装できるはずです。ただし、16 ビット プロセッサから 32 ビット プロセッサへの移行により、プリエンプティブ マルチタスクの実装を容易にする他のハードウェア機能も導入されました。

また、32 ビット プログラムは新しいものであったため、強制的に切り替えても動作させるのが簡単でした。これにより、一部の従来の 16 ビット プログラムが壊れる可能性がありました。

もちろん、これはすべて推測です。MS が Windows 3.x (386 拡張モードにもかかわらず) にプリエンプティブ マルチタスクを実装しなかった理由を本当に知りたい場合は、そこで働いていた人に尋ねる必要があります。

また、Windows 95 は DOS のラッパーに過ぎないというあなたの思い込みを訂正したいと思いました ;)

答え2

それは、Windows と呼ばれる単一のプログラムを継続的に実行していました。そのプログラムは、CPU 時間 (およびその他のリソース) をさまざまなプログラムに分散していました。

次の例えを考えてみましょう。

一度に 1 人しか入れないオフィスがあります (その人は DOS さんまたは DOS さんと呼ばれます)。その人は一度に 1 つの作業を行います。たとえば、1 人の人に電話をかけて、その人と 24 時間 365 日チャットを開始します。

今度は、その人を秘書さんに置き換えます。(Windows) 秘書さんは誰かに電話をかけ、ずっと話します (それでも単一のタスクです)。そしてしばらくすると、相手は「今は十分話しました。他の人と話して、しばらくしてから電話してください」と言います。

秘書さんが他の人に電話をかけます。その人が同じことを言うまで、その人とチャットします。その後、次の人に電話をかけ、話す相手のリストの最後に達するまで続けます。その時点で、上からまた始まります。

  • 技術的には、これは協調型マルチタスクと呼ばれます。そのためには、他の人が十分な CPU 時間を確保していることを宣言する必要があります。一方が宣言しない場合は、すべてが崩壊します。
  • 現代のシステムははるかにスマートです。先制的なマルチタスクも含まれています。秘書が目覚まし時計をセットし、5 分後に相手との通話を切るところを想像してください。「それはいいですね、ジェーン。でも今はジョーと話さなければなりません。しばらくしてから折り返し電話します。- クリック。」

複数のプロセッサを追加すると、さらに複雑になります。:)

答え3

最新のオペレーティング システムでは、オペレーティング システムがすべてのハードウェア リソースを制御し、実行中のアプリケーションはサンドボックス内に保持されます。アプリケーションは、OS がそのアプリケーションに割り当てていないメモリにアクセスすることは許可されず、コンピューターのハードウェア デバイスに直接アクセスすることもできません。ハードウェア アクセスが必要な場合、アプリケーションはデバイス ドライバーを介して通信する必要があります。

OSはCPUに入力を強制することでこの制御を強制することができる。保護モード

一方、DOSは保護モードに入ることはなく、リアルモード*. リアルモードでは、実行中のアプリケーションは、ハードウェアに直接アクセスするなど、必要なことをすべて実行できます。ただし、リアルモードで実行中のアプリケーションは、CPU に保護モードに入るように指示することもできます。

そして、この最後の部分により、Windows 95 などのアプリケーションは、基本的に DOS から起動された場合でも、マルチスレッド環境を開始できるようになります。

DOS (ディスク オペレーティング システム) は、私の知る限り、ファイル管理システム以上のものではありませんでした。ファイル システム、ファイル システムをナビゲートするメカニズム、いくつかのツール、およびアプリケーションを起動する機能を提供しました。また、マウス ドライバーや EMM エミュレーターなど、一部のアプリケーションを常駐させることができました。しかし、現代の OS のようにコンピューターのハードウェアを制御しようとはしませんでした。

* DOS が 70 年代に初めて作成されたとき、CPU には保護モードは存在しませんでした。保護モードが CPU の一部になったのは、80 年代半ばの 80286 プロセッサが登場してからでした。

答え4

マルチタスクとは、複数のアプリケーションを同時に実行しているという錯覚に過ぎません。ユーザー側では同時に実行されているように見えますが、実際にはプロセス A、B、C が、A、B、C、A、B、C、A、B の順序で CPU 時間を共有しています。これらは、非常に速くオンとオフを切り替えているだけです。実際には、2 つのプロセスが同時に実行されているわけではありません。

したがって、1 つのプロセスを一時停止し、次のプロセスを短時間実行し、そのプロセスを一時停止し、最初のプロセスに戻る、などとすることで、MS-DOS をマルチタスクにすることは完全に可能です。

マルチタスクは、CPU がこれらのプロセスを循環させ続け、エンド ユーザーには同時に実行されているように見えるほど高速になったときに開発された巧妙な機能です。

覚えている方もいるでしょうが、Windows が遅すぎたため、ゲームはまだ DOS4GW で実行されていました。

関連情報