0
Object1 * test= new Object1();

「テスト」には、RAM 上の絶対アドレスまたは RAM のゼロアドレスへの相対開始点を持つ仮想メモリ内の絶対アドレスがありますか?

例として、非常に断片化されたメモリで、10 時間にわたってそれぞれ割り当てと割り当て解除を何度も行う多くのアプリケーションを開始しました。アプリケーションの 1 つは、RAM エラー チェックとベンチマークのアプリケーションです。すべての RAM アドレスをテストできますか、それとも限られた領域でのみ実行できますか? すべての RAM に達した場合、オブジェクトを移動する以外に、OS はどのようにして他のアプリからアプリを保護できますか? 特に、固定されていないアレイを pci-e から pci-e にストリーミングする場合。

4

2 に答える 2

3

ほとんどの OS は仮想アドレッシングを使用するため、プログラムが認識するアドレスは、RAM 自体の物理アドレスとはほとんど無関係です。

ただし、固定の物理アドレスを持つ物理メモリを割り当てるために使用できる特別な機能を備えているものもあります。たとえば、Windows では、AllocateUserPhysicalPagesいくつかの物理ページを割り当てるために使用できます (仮想アドレスにマップしたり、仮想アドレスからマップ解除したりできます)。

ただし、これでも限られた領域しかテストできません。多数の物理ページを割り当てようとし、可能であれば成功しますが、(たとえば) ブート時に特定のメモリ位置にマップされ、シャットダウンされるまでそこにとどまるカーネルの部分もあります (メソッドはありません)。彼らに移動を依頼するために提供されています)。

于 2016-09-12T20:00:32.240 に答える
1

仮想メモリ空​​間では同じアドレスのままです。これは物理メモリ空間とは異なります - それがページングファイルの目的であり、利用可能な物理メモリの合計よりも多くのメモリを合計で割り当てることができることを覚えておいてください。また、2 つの異なるアプリケーションが同時に new/malloc を呼び出すことで、同じ (仮想) メモリ アドレスを取得できます (ただし、両方が同時にページインされた場合、実際には物理メモリ内の異なるアドレスになります)。

つまり、物理メモリをテストするアプリケーションを実際に実装することは、メモリを仮想化するシステム (基本的に、Windows、Linux などの最新のすべてのシステム) では簡単ではありません。そのため、物理メモリに直接アクセスして利用できるようにするために、多くのメモリ チェック アプリケーション (Memtest など) が起動可能なドライブから実行されます。

ところで。Linux には「オーバーコミット」と呼ばれる機能 (通常はデフォルトで有効になっています) があることに注意してください。つまり、new/malloc は「有効な」オブジェクト アドレスを返すことができますが、物理的な場所にはまったく対応していません (つまり、まだ対応していません)。 「本当に」割り当てられます)。また、メモリは、そのメモリ領域に実際に何かが書き込まれたときにのみ割り当てられます。

于 2016-09-12T20:02:56.920 に答える