2013-08-30 27 views
7

私の質問はthisに似ていますが、私は少し違うものを求めています。std :: vector要素は物理メモリ内で連続していますか?

最初のstd::vector要素のアドレスをC型の配列として使用できることは明らかです。つまり、仮想メモリでは、std::vectorの要素は連続しています。ただし、物理メモリが断片化されている場合は、実際にstd::vectorが物理メモリの多くの部分に分割されている可能性があります。

私の質問はstd::vector要素が物理メモリ(仮想メモリと同様)に連続していますか?

+4

@hsouza:それは彼がリンクしているものです。彼は、OS自体が連続性を「偽造」することができるかどうかを尋ねているようだが、「本当の」メモリ分割がある。率直に私はそれを取得しません。 – GManNickG

+0

@hsouza私はこの問題へのリンクを追加しました。 – ST3

+2

mallocはmmapを使用しているので、mmapが連続した物理メモリを与えることができるかどうかという疑問があります。あなたはこれを見たことがありますか:http://stackoverflow.com/questions/4401912/linux-contiguous-physical-memory-from-userspace – LarryPel

答えて

14

ベクトルにデータを格納するために使用されるメモリは、そのアドレスがコードに見えるため、連続したアドレスである必要があります。

最新のCPU/OSの典型的なケースでは、仮想アドレスが連続している必要があります。これらの仮想アドレスがページ境界を横切る場合、物理アドレスがもはや連続していない可能性が高くなります。

これはめったに重要なことではないことを付け加えておきます。最新のシステムでは、多くの場合、ハードウェアレベルに至るまで、断片化されたメモリの使用を少なくともいくらかサポートしています。例えば、多くのネットワークおよびディスクコントローラは、「スキャッタ/ギャザー」機能を備えており、OSはページテーブルを使用してバッファの仮想アドレスを物理アドレスに変換した後、物理アドレスをコントローラに直接供給し、それらがメモリからペリフェラルに転送されている場合、またはペリフェラルからメモリに転送されている場合は、それらのアドレスにデータを「分散」する場合は、それらのアドレスからのデータ

6

いいえ、C++の抽象マシンで物理メモリが連続して提供される保証はありません。 malloc以下の抽象とハードウェアは、不連続なメモリを自由に使用できます。

対象となる実装のみがそのような保証を行うことができますが、言語/モデルは気にしません。それは、その仕事をするためにシステムに依存しています。

1

仮想メモリから物理メモリへのマッピングは、主にCPUによって処理されますが、カーネルがサポートされます。ユーザーランドプロセスは、このマッピングが何であるかを知ることができません。プログラミング言語に関係なく、プログラムは仮想メモリアドレスのみを扱います。ページ境界に跨った2つの隣接する仮想メモリアドレスが物理メモリ内で隣接している場合、期待することはできませんし、見つけ出す方法もありません。したがって、気になる点はまったくありません。

+3

"見つけ出す方法もありません" - これは一般的に真実ではありません。一般的に、すべてのOSは(見つかっていないにもかかわらず、カスタムドライバが必要な場合があります)http://stackoverflow.com/質問/ 6252063 /最も単純な方法から物理アドレスへの論理的なone-in-linuxカーネルモジュールhttp://stackoverflow.com/questions/366602/how-to-translate-a -virtual-memory-address-to-a-physical-address;一方、そのようなことを行う標準的な方法はないと私は同意します。 –

+0

OK、@Matteo、ユーザーランドプログラムがLinux上のCの任意のポインタに対応する物理アドレスをどのように決定するのか、その情報を使用する方法を教えてください。 – Emmet

+1

たとえば、上記の最初のリンクで説明した手順を実行し、結果を返すカスタムドライバを問い合わせます。そのためには、カーネルデバッガのフロントエンド、ハックツールなどがあります。私の指摘は、「見つけ出す方法がない」ということは正しいとは言えず、単純に標準*や*単純な方法がないということです。私はそれがニックピッキングであることを知っています(そして、あなたがここで持っている+1は私のものです)。しかし、私は間違った絶対的なステートメントが好きではありません。 –

関連する問題