3

この質問が何度も聞かれるのを見ました。しかし、合理的な答えを見つけることができませんでした。実際の仮想メモリの制限は何ですか?

CPUのアドレス可能な最大サイズですか?たとえば、CPUが32ビットの場合、最大は4Gですか?

また、一部のテキストはそれをハードディスク領域に関連付けています。しかし、それが良い説明であることがわかりませんでした。CPUが生成したアドレスと言う人もいます。

私たちが見るすべてのアドレスは仮想アドレスですか?たとえば、GDBを使用してプログラムをデバッグするときに表示されるメモリの場所。

CPUが仮想アドレスを生成する背後にある歴史的な理由は?一部のテキストでは、仮想アドレスと論理アドレスを同じ意味で使用しています。どう違うの?

4

1 に答える 1

7

残念ながら、答えは「場合による」です。オペレーティング システムについては触れていませんが、GDB について言及したときに Linux をほのめかしていました。私は私の答えで完全に一般的になろうとします。

基本的に 3 つの異なる「アドレス空間」があります。

1 つ目は、論理アドレス空間です。これはポインタの範囲です。最新 (386 以上) には、オペレーティング システムが実際の (物理) メモリを任意のアドレスに表示できるようにするメモリ管理ユニットがあります。典型的なデスクトップ マシンの場合、これは 4KB のチャンクで行われます。プログラムがあるアドレスでメモリにアクセスすると、CPU はその論理アドレスに対応する物理アドレスを検索し、それを TLB (変換ルックアサイド バッファー) にキャッシュします。これにより、次の 3 つのことが可能になります。1 つ目は、オペレーティング システムが各プロセスに好きなだけアドレス空間を与えることを可能にします (ポインターの範囲全体まで、またはプログラムがアドレス空間のセクションをマップ/マップ解除できるようにする API がある場合はそれを超えて)。 )。次に、別のメモリ マッピングに切り替えることで、別のプログラムを完全に分離できます。あるプログラムが別のプログラムのメモリを破壊することを不可能にします。第三に、開発者にデバッグ支援を提供します。ランダムに破損したポインターが、まったくマップされていないアドレスを指している可能性があり、「セグメンテーション違反」や「無効なページ違反」など、用語は OS によって異なります。

2 番目のアドレス空間は物理メモリです。それは単なる RAM です。RAM の量には限りがあります。メモリがマップされた I/O を持つハードウェアもあるかもしれません。デバイスは RAM のように見えますが、実際には PCI カードやビデオ カードのメモリなどのハードウェア デバイスです。

3 番目のタイプのアドレスは、仮想アドレス空間です。プログラムが必要とする物理メモリ (RAM) よりも少ない物理メモリ (RAM) がある場合、オペレーティング システムは、実際には RAM の一部のみを使用し、残りを RAM として使用することで、大量の RAM があるようにプログラムに錯覚を与えることで、より多くの RAM があることをシミュレートできます。 「スワップファイル」で。たとえば、マシンに 2MB の RAM があるとします。4MB 割り当てられたプログラムがあるとします。何が起こるかというと、オペレーティング システムは 4MB のアドレス空間を予約します。オペレーティング システムは、その 4MB の最近/頻繁にアクセスされた部分を実際の RAM に保持しようとします。頻繁に/最近アクセスされていないセクションは、「スワップ ファイル」にコピーされます。プログラムが実際にはメモリにない 4MB の部分に触れると、CPU は「ページ フォールト」を生成します。オペレーティング システムは、最近アクセスされていない物理メモリを見つけて、そのページに「ページ イン」します。アクセス中のデータをページインする前に、そのメモリ ページの内容をページ ファイルに書き出す必要がある場合があります。これがスワップファイルと呼ばれる理由です。通常、スワップファイルから何かを読み取るとき、おそらく最初に何かを書き出す必要があり、メモリ内の何かをディスク上の何かと効果的に交換します。

典型的な MMU (メモリ管理ユニット) ハードウェアは、どのアドレスがアクセス (読み取り) され、変更 (書き込み) されたかを追跡します。典型的なページングの実装では、ページイン時にデータがディスクに残ることがよくあります。これにより、変更されていないページを「破棄」して、スワップ時にページを書き出すことを回避できます。典型的なオペレーティング システムは定期的にページ テーブルをスキャンし、物理メモリのどの部分が変更されていないかをインテリジェントかつ迅速に選択できるようにするある種のデータ構造を保持し、時間の経過とともにメモリのどの部分が頻繁に変更されるか、どの部分が変更されるかについての情報を構築します。しないでください。

典型的なオペレーティング システムは、頻繁に変更されないページを穏やかにページ アウトすることがよくあります (実際の作業に干渉するほど多くのディスク I/O を生成したくないため、穏やかにページ アウトします)。これにより、スワッピング操作でメモリが必要になったときにページを即座に破棄できます。

典型的なオペレーティング システムは、すべての「未使用」メモリ スペースを使用して、アクセスされるファイルの一部を「キャッシュ」(コピーを保持) しようとします。メモリはディスクよりも数千倍高速であるため、何かが頻繁に読み取られる場合は、RAM にある方が大幅に高速です。通常、仮想メモリの実装は、スワッピング操作のためにすばやく再利用できるメモリのソースとして、この「ディスク キャッシュ」と結合されます。

効果的な仮想メモリ マネージャーを作成することは非常に困難です。変化するニーズに動的に適応する必要があります。

典型的な仮想メモリの実装は非常に遅く感じます。マシンが RAM よりもはるかに多くのメモリを使用し始めると、全体的なパフォーマンスが非常に悪くなります。

于 2011-09-24T02:53:32.810 に答える