32ビットOSの32ビットプロセスに2 GBの制限があるのはなぜですか。ブログの投稿チャットの質問:32ビットおよび64ビットプロセスのメモリ制限によると、制限は3 GBに拡張できますが、疑問は残ります。
物理的な制限は4 GBですが、2 GBまたは3 GBはWindowsでハードコードされているだけですか? 32ビットプロセスの4 GBが64ビットOSにあるのはなぜですか。
注:この質問は重複としてマークされていますが、参照されている質問は、32ビットアドレス空間の4 GBの制限に関するものです。これは[〜#〜]ではありません[〜#〜]私が求めていることです。 32ビットプラットフォームであっても、Windowsがプロセスを2 GBに制限する理由を具体的に質問します。受け入れられた回答はそれについて言及していますが、その理由を説明していません。
NTプラットフォームでは、4 GBの仮想アドレス空間はデフォルトで2つの部分に分割されます。下位2 GBはプロセスアドレス空間用で、上位2 GBはシステム用です。
このアドレススペースは仮想であり、RAMサイズの影響を受けません。CPUおよびOSのメモリマネージャーは、RAMの一部を必要に応じて仮想アドレススペースにマップします。これは非常にこれは複雑であり、ここでは説明しませんこれは、パフォーマンス、セキュリティ、および信頼性のために行われた設計上の決定です。
各プロセスには独自のプライベート2 GBアドレス空間がありますが、システムアドレス空間は1つしかありません。プロセスは独自のプライベートアドレス空間に分離されており、他のプロセスを見ることさえできません。必要に応じて、2つ以上のプロセス間でアドレスを共有するための規定があります。システムアドレススペースは、通常のプロセスの立ち入り禁止であり、OS自体やデバイスドライバーなどのカーネルレベルのコンポーネントにのみアクセスできます。プロセスが誤った場合、それはそれ自体を傷つけるだけです。他のプロセスとOSは影響を受けません。
ただし、プロセスと同じように、システムに独自のプライベートアドレス空間を割り当てないのはなぜですか?これにより、システムと各プロセスで4 GBのアドレス空間全体を使用できるようになります。それはできたかもしれませんが、問題がありました。
それが行われたと仮定します。実行中のプロセスは、独自のコードとデータに完全にアクセスでき、すべてが正常に見えるようになります。しかし、そのプロセスが、I/O操作などのシステムアドレススペースへのアクセスを必要とするOS呼び出しを行うとどうなりますか?または、カーネルで処理する必要のある割り込みがある場合はどうなりますか?
CPUから見えるのは、実行中のプロセスのアドレス空間だけです。何をすべきか?解決策は、システムアドレス空間を表示するコンテキストスイッチを実行することです。 OSはこれを非常に効率的に実行できますが、時間がかかります。システムアドレス空間に頻繁にアクセスする必要がある場合、コンテキストスイッチのオーバーヘッドが過剰になり、パフォーマンスが低下します。
もっと良い方法がなければなりませんでした。
採用されたソリューションは、4 GBの合計アドレススペースを、それぞれ2 GBの2つの部分に分割することでした。下部の2 GBのプロセスアドレス空間と上部のシステム。これにより、システムアドレススペースは常にスコープ内にあり、コンテキストスイッチなしで必要なときにいつでもアクセスできます。よくあることですが、設計上の決定は実際的な理由で行われます。
現在、2 GBは非常に小さく制限されているように見えるかもしれませんが、NTが1993年にリリースされたときは巨大でした。そして、各プロセスには独自の2 GBがあることを忘れないでください。
Windows Internalsの本によると、それは設計上の決定でした。 4 GBの仮想メモリ空間全体を2つの部分に分割しました。
次に、非推奨/3GB
スイッチ(カーネル1:3ユーザーを変更し、絶対オフセットで割り当てるドライバーで厄介なバグが発生する可能性があります)、 [〜#〜] pae [〜#〜] そして1つあったと思いますより多くのAPIを使用すると、非ページメモリを割り当て、それをプログラムのアドレス空間に動的にウィンドウできます(ただし、現在のところ、その名前を思い出せません)。