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


113

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

しかし、Windowsの古いバージョン(Windows 95も含む)がDOSの単なるラッパーである場合、WindowsはマルチタスクOSとしてどのように実行できますか?


8
-それは、プリエンプティブマルチタスクと呼ばれていますsupport.microsoft.com/kb/117567
joeqwerty

20
それよりもはるかに優れた「古い」を定義する必要があります。「386拡張モード」のDOS + Windows 9xおよびDOS + Windows 3.xは、これに関して「標準モード」および「リアルモード」のDOS + Windows 3.x / 2.xとはまったく異なっていました。そして、joeqwertyが暗示するように、協調的なマルチタスクと予兆がありました。これについては本全体が書かれているので、特定の質問の方が良いです。
JdeBP

5
@joeqwerty最も素晴らしいIMOは、Microsoftが非常に古いソフトウェアに関するドキュメントをオンラインで保持していることです。MS-DOSの古いバージョンに関する高度なトピックに関する記事もあります。
何も不可能14年

6
DOSはマルチタスクを提供しません。DOSの助けがなくても、その上に完全にマルチタスクプログラムを書くことができます。これは初期のWindowsが行うことです。Windows 95は、DOSの単なる「ラッパー」ではありません。
ボアン

3
@NigelNquande私は実際にMSが古いドキュメントを維持することについてかなり良いことを発見しました。廃止されたKB記事のほとんどは、記載されている12か月の終了後もオンラインです(たとえば、ランダムなWindows 3.1 KB、Windows 2.1-3.0 のprintユーティリティに関するドキュメント、またはMS-DOS 5.0のansi.sys)。 -猶予期間。アクティブな製品ドキュメントほど簡単に閲覧できないため、検索で具体的に指定する必要があります。
ジェイソンC 14年

回答:


160

Windows 95

Windows 95 は、MS-DOSの「単なるラッパー」以上のものでした。レイモンド・チェンの引用:

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

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

Windows 95は実際にはほとんどすべてのMS-DOSをフック/オーバーロードし、互換性レイヤーとして維持しながら、すべての重労働を行います。また、32ビットプログラムのプリエンプティブマルチタスクを実装しました。


Pre-Windows 95

Windows 3.x以前はほとんど16ビットでした(16と32をブリッジするちょっとした互換性レイヤーであるWin32を除きますが、ここではそれを無視します)。DOSに依存し、協調マルチタスクのみを使用しました。実行中のプログラムを強制的に切り替えないもの。実行中のプログラムが制御を得るまで待機します(基本的に、待機中の次のプログラムを実行するようにOSに伝えることで「完了」と言います)。

MacOSの古いバージョンと同様に、マルチタスクは協調的でした(ただし、マルチタスクDOS 4.xはプリエンプティブマルチタスクを実行していません)。別のタスクをスケジュールするには、タスクがOSに譲らなければなりませんでした。yieldは特定のAPI呼び出し、特にメッセージ処理に組み込まれました。タスクがタイムリーにメッセージを処理する限り、すべてが素晴らしかったです。タスクがメッセージの処理を停止し、処理ループの実行でビジーだった場合、マルチタスクはそれ以上でした。

Windows 3.xアーキテクチャ

初期のWindowsプログラムがどのように制御をもたらすかについて:

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

ソース

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

386拡張モード?

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

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

MS-DOSはそれらの仮想マシン内でも実行され、明らかに先制的にマルチタスク化されていたようです-したがって、386拡張モードハイパーバイザーは仮想マシン間でCPUタイムスライスを共有するようです(1つは通常の3.xを、もう1つはMSを実行しました) -DOS)、および各VMは独自の処理を行います。3.xは協調的にマルチタスクを実行し、MS-DOSはシングルタスクを実行します。


MS-DOS

DOS自体は紙上ではシングルタスクでしたが、ハードウェア割り込みによってトリガーされるまでバックグラウンドに留まるTSRプログラムをサポートしていました。真のマルチタスクとはほど遠いですが、完全にシングルタスクではありません。


ビットネスのこのすべての話?マルチタスクについて質問しました!

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

また、32ビットプログラムは新しいものであるため、強制的に切り替えたときに動作しやすくなりました。これにより、一部のレガシー16ビットプログラムが破損する可能性がありました。

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

また、Windows 95はDOSのラッパーであるという仮定を修正したかったのです;)


4
非常に素晴らしい記事。私の記憶が正しければ(OS設計クラスは何年も前のことです)、Windows 9xはタイマー割り込みをフックして、2番目から最後の段落で提案したように、独自のスケジューラーを強制します。同じことをするDOS上に他のOSがありました。AMX(産業用アプリケーションのリアルタイムOS)とXINU(教育目的の小さなUnix / PosixのようなOS)の両方がDOS上で実行されたことを私ははっきりと覚えています。(AMXはあまりにもストレートEPROMからベアメタルを実行することができDOS上で実行する各テストの再燃焼EPROMSからあなたを保存するときには、/デバッグをテストするためにはるかに簡単だった。。。)
Tonny

@Tonnyそのスキームが可能である(そして実際に使用されている)ことを確認してくれてありがとう。推測では、Windows 1-3がプリエンプティブマルチタスクを使用しなかった理由は、そうすることができなかったほどではなく(MS-DOS 4にはリリースされていませんが)、むしろDOSとの後方互換性が壊れていたでしょうプログラム。
ボブ14年

3
Mmmmhhh Windows 1〜3の検討:8086 CPU以上の一般的なコードベースであるという事実は、それと関係がある可能性があります。適切なring0-3の処理は80286以降でのみ可能であり、それがWin9xがマルチタスクの実装に使用したものでした。4DOSなどは、DOS上で制限付きのマルチタスクをすでに提供しています(正しく思い出すと80286が必要でした)。Win3自体を4DOSの別のプロセスとして実行することもできます。
トニー14年

1
Xinuは実際にはDOS上で実行されませんでした。結局、それはLSI-11オペレーティングシステムとして始まりました。DOS + Windows 3.xには事前のマルチタスクがなかったという声明は偽です。386拡張モードには、VMMの好意がありました。そして、4DOSについてのナンセンスはあなたによくある答えを得ます:4DOSはオペレーティングシステムではありません。マルチタスクを提供したという記述は完全に間違っています。
JdeBP 14年

2
PDP-8はプリエンプティブマルチタスクをサポートし、それはたった12ビットのコンピューターでした。
david25272

26

Windowsと呼ばれる1つのプログラムを継続的に実行しました。その1つは、異なるプログラム間でCPU時間(およびその他のリソース)を分散させます。

この類推を考慮してください:

一度に1人しか持てないオフィスがあります(その人はミスターまたはミサスDOSと呼ばれます)。その人は一度に一つのことをします。たとえば、1人のユーザーに電話をかけ、24時間年中無休でチャットを開始します。

今、あなたはその人を秘書さんに置き換えます。(ウィンドウ)。誰かに電話をかけ、いつも話しかけます(1つのタスクのみ)。それからしばらくすると、相手は「今のところ十分話しました。他の人と話して、少し電話をかけ直してください」と言うでしょう。

秘書さんが相手に電話します。その人が同じことを言うまで、その人とチャットします。次に、会話する人のリストの最後になるまで次の人を呼び出します。その時点で、再び上部から開始されます。

  • 技術的には、これは協調マルチタスクと呼ばれます。他の人には十分なCPU時間があると言う必要があります。そうしないと、すべてが崩壊します。
  • 最新のシステムははるかにスマートです。プリエンプティブマルチタスクを含む。秘書が目覚まし時計を設定し、5分後に相手を切断することを考えてください。「それはいいジェーンです。しかし、私は今ジョーと話をしなければなりません。少し後で電話します。-クリック。」

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


1
最初の点で協調的/非プリエンプティブマルチタスクを意味していませんか?また、興味深いことに、Windows 95は32ビットプログラムのプリエンプティブマルチタスクを導入しました。DOSをブートローダーとして使用するOSでしたが、DOSの主要部分を置き換えた(16ビット/ DOSプログラムをサポートするのに十分な)OSだったため、DOSのラッパーではありませんでした。
ボブ14年

ミスターまたはミス、「Dr。」DOS?
gtrak 14年

1
「継続的に単一のプログラムを実行していました。そのプログラムは異なるプログラム間でCPU時間(およびその他のリソース)を分散させていました。」どのオペレーティングシステムについても言えませんか?質問はMS-DOSができなかったことを暗示していますが。テクノロジーの技術的詳細を廃止するとき、私はアナロジー/メタファーに強く反対します。さて、仮想オフィスがどのように機能するかがわかりましたか?それは質問への答えを本当に説明しません。
セレリタス14年

13

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

OSは、CPUを強制的に保護モードにするため、この制御を強制できます

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

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

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

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


2
当時、CPUにはプロテクトモードなどはありませんでした。
14年

1
@jwenting-良い点、私はそれについてのメモを追加した
ピート14年

6

マルチタスクDOSアプリケーションの最初のバージョンであるWindows 3.xの前には、DesqViewのようなプログラムもありました。たとえば、3つのDOSセッションを一度に実行している場合、DesqViewは4つの仮想マシンを作成します。3つのDOSセッションはそれぞれ、マシン全体を「所有」していると考えますが、実際にはファイルI / Oを実行するものはありません。代わりに、各セッションで実行されているDOSのバージョンにパッチを適用し、ファイルI / Oの要求をその目的専用の特別なセッションに転送します。PCのテキストモードハードウェアは、メモリ領域の内容を文字として継続的に表示するため、DesqViewは、各セッションの0xB8000-0xB9FFF範囲を独自のRAM領域にマッピングすることにより、各セッションに独自の仮想スクリーンを持たせることができます。定期的に現在のアプリケーションの領域を物理的な画面バッファーにコピーします。ディスプレイボード上の256KのRAMは、64Kのアドレス空間、一部のI / Oレジスタ、および特定の特定のシーケンスでの読み取りと書き込みを必要とする「興味深い」ハードウェアを使用して制御されたため、グラフィカルサポートははるかに困難でした。テキストモードでは、アプリケーションがテキストバッファーに何かを書き込むと、DesqViewは次のタイマーティックでディスプレイにコピーする必要があることを示すフラグを設定できます。DesqViewの介入が必要なのは、指定されたタイムティックのテキストバッファへの最初の書き込みのみです。他のすべては、次のタイマーティックに統合されます。ディスプレイボード上の256KのRAMは、64Kのアドレス空間、一部のI / Oレジスタ、および特定のシーケンスで読み取りと書き込みを必要とする「興味深い」ハードウェアを使用して制御されたためです。テキストモードでは、アプリケーションがテキストバッファーに何かを書き込むと、DesqViewは次のタイマーティックでディスプレイにコピーする必要があることを示すフラグを設定できます。DesqViewの介入が必要なのは、指定されたタイムティックのテキストバッファへの最初の書き込みのみです。他のすべては、次のタイマーティックに統合されます。ディスプレイボード上の256KのRAMは、64Kのアドレス空間、一部のI / Oレジスタ、および特定のシーケンスで読み取りと書き込みを必要とする「興味深い」ハードウェアを使用して制御されたためです。テキストモードでは、アプリケーションがテキストバッファーに何かを書き込むと、DesqViewは次のタイマーティックでディスプレイにコピーする必要があることを示すフラグを設定できます。DesqViewの介入が必要なのは、指定されたタイムティックのテキストバッファへの最初の書き込みのみです。他のすべては、次のタイマーティックに統合されます。DesqViewは、次のタイマーティックでディスプレイにコピーする必要があることを示すフラグを設定できます。DesqViewの介入が必要になるのは、指定されたタイムティック内のテキストバッファへの最初の書き込みのみです。他のすべては、次のタイマーティックに統合されます。DesqViewは、次のタイマーティックでディスプレイにコピーする必要があることを示すフラグを設定できます。DesqViewの介入が必要になるのは、指定されたタイムティック内のテキストバッファへの最初の書き込みのみです。他のすべては、次のタイマーティックに統合されます。

対照的に、グラフィックモードを仮想化するには、DeskViewが個々の書き込みをすべてトラップして、メモリまたはI / Oレジスタを表示する必要があります。これにより、メモリ書き込みが約100倍遅くなり、グラフィックプログラムはテキストプログラムよりも多くのデータを書き込む必要があるため、ほとんどのグラフィックソフトウェアのリアルタイム仮想化は実用的ではありませんでした。代わりに、グラフィックスは、フォアグラウンドアプリケーションになるまでグラフィックスを一時停止しようとする非フォアグラウンドアプリケーションを持ち、画面全体を完全に制御することで処理されました。制御が別のアプリケーションに切り替えられると、DesqViewはすべてのグラフィックレジスタの状態のコピーを作成してから切り替えようとします。グラフィカルアプリケーションに切り替えると、DesqViewは保存された状態を復元します。

ある意味では、マルチタスクの非グラフィカルDOSアプリケーションは、共有リソースが非常に少なく、アプリケーションが相互にやり取りする必要がないため、マルチタスクのWindowsアプリケーションよりも簡単でした。対照的に、Windowsでは、クリップボードや、あるプログラムのウィンドウが他のウィンドウを覆い隠すような動きをする可能性などに対処する必要があります。Windows 95はWindowsの最初のバージョンであり、コードが描画を試みている間に画面の領域が使用できなくなることに対応できるウィンドウシステムのようなものを含めることにより、このような制限を克服できました(描画がマスクされる効果があります) )。


DesqViewについて思い出させてくれてありがとう。私はいつもそれを使用していましたが、それを完全に忘れていました。
エメット14年

3

マルチタスクは、アプリケーションを同時に実行しているように見えるだけです。あなたの側では同時実行として認識されますが、実際にはプロセスA、B、Cはこの順序でCPU時間を共有しています:A、B、C、A、B、C、A、B ...すぐにオフになります。2つのプロセスが実際に同時に実行されることはありません。

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

マルチタスクは、CPUがこれらのプロセスを回転し続け、エンドユーザーに同時に見えるようにするのに十分なほど高速になり始めたときに開発された単なる巧妙な機能です。

覚えている人にとっては、Windowsが遅すぎたため、ゲームはDOS4GWでまだ実行されていました。


1
そしてほとんどの場合、それは今日までオペレーティングシステムで物事がどのように機能するかです。そのため、たとえば4コアCPUで「同時に」10のことを実行できます。
14年

2
「CPUが十分に高速になり始めた」ということではありません。'286(1983年にPCに導入された優れたOS、Mark Williams CompanyのCoherentなど)でマルチユーザーマルチタスクオペレーティングシステムを実行できました。「Millenium」までのMS-DOSおよびWindows(NTを除く)バージョンは、当時の技術標準であっても客観的な標準によって本当に酷いものでしたが、MS-DOSがIBMによってPCの標準として確立されると、マイクロソフトのマーケティングと勢い(独占力の犯罪的乱用は言うまでもありません)は、非常に長い間、より良い競争を事実上排除しました。
エメット14年

2
「マルチタスクは、CPUが十分に高速になり始めたときに開発された巧妙な機能です...」Apollo Guidance Computerがマルチタスク設計であったように思われますか?
CVn

1
「CPU」と言ったときは大量生産のものを意味し、「マルチタスク」と言ったときはPCアプリケーションのマルチタスクを意味していました。そして最後に、「エンドユーザー」とは、宇宙飛行士ではなく、PCの背後にいる子供を意味しました。それでも、興味深いコメントには賛辞を送ります。
ダンHorvat

0

1つのタスクのみに焦点を当てることができますが、それが行うことは、あるタスクから別のタスクにすばやく移動する単純なステップです。このように、それはマルチタスキングであるように見えましたが、実際には1に焦点を当ててから、別のものに、次に別のものに、などなど。


そこで、マルチタスクマルチプロセッサコンピューティングを融合させています。コンピューターの世界では、複数のタスクを非常に高速に切り替えることはマルチタスクです。通常の定義では、並列実行は必要ありません。さまざまな「古いバージョンのWindows」は、Windowsのバージョン、実行されたモード、そもそもDOSベースであるかどうかに応じて、マルチタスクを異なる方法で実行しました。(Windows NT 3.1はDOS + Windows 95よりも古いものであり、SMPを実行できます。)別のコメントで指摘したように、この本全体が書かれています。それは本当に最高の2文の要約ではありません。
JdeBP 14年

@JdeBP ...私は主にシングルコアプロセッサを使用しているので、マルチタスクとマルチプロセッサの違いを知っています!コンピューターは連続して動作します。真の並列は、量子コンピューティングでのみ見られます。
トート14年

0

私がここで言及していなかった1つのことは、ちょっと面白いです:

Windows 3.0はプリエンプティブマルチタスクシステムではなく、OS X--Oneアプリが他のアプリがアクションを実行する前に呼び出しから復帰するまで、MacOSのすべてのバージョンのように協調的でした。

しかし、コメンターが私に思い出させたように、DOSアプリはマルチタスクでした。これは、それらが「協調的に」マルチタスクに書き込まれていないためです(これを使用するシステムに常に組み込む必要があります)。

当時、今日のデバイスドライバーに取って代わるTSR(Terminate-Stay Resident)と呼ばれるプログラムがありました。これらのドライバーは独立して実行されます。一般的には、OSのイベントハンドラーのいずれかに自分自身を挿入することにより、独自のスレッドで実行されます。Windowsは一般にそれらについては知りませんでした。それらは低いレベルで実行されました。

これらは実際にはWindowsアプリではありませんでしたが、プリンタードライバー、COMドライバーなど、Windows 3.1より前のすべてのスレッド処理が行われた方法でした。

Windows 3.1はマルチタスクでしたが、DOSはそうではありませんでしたが、Windows 3.1はdosを邪魔にならないようにプッシュし、起動時に引き継ぎました(その後、しばしばDOSプロンプトからwindowsを起動しました)。


Windows 3.0は、386以上のプロセッサで実行する場合、DOSアプリケーションのプリエンプティブマルチタスクをサポートしていました。Windowsアプリケーションのみが協調的にマルチタスクされました。
ジュール14年

ああ、それは正しいです。私は当時Windowsアプリをコーディングしていて、DOSについては本当に考えていませんでした。DOSアプリの扱いが異なりました-それを指摘してくれてありがとう。
ビルK 14年

-8

良い質問。MS-DOSでは、カーネルはモノリシックでした。つまり、Windows 9xおよび現在のバージョンで実装された新しい最新のカーネルに対して、一度に1つのタスクしか処理しませんでした。詳細はこちらをご覧ください


11
-1単一のOSがマルチタスクを実行できないことを示唆します。これはまったく間違っています。linuxは非常に単調なカーネルです(linus torvaldsとandrew tanenbaumの間で有名な議論がありました)が、linuxは明らかにマルチタスクが可能です。ここでは、Linux表示するリンクは、モノリシックされているstackoverflow.com/questions/1806585/...
barlopは

4
モノリシックとは、あなたが考えるとは限らないことです。
アンデルセン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.