7

どんな提案/議論も大歓迎です!

質問は実際にはタイトルのように簡単ですが、物理的な住所が必要な理由を説明します。


背景:

最近はキャッシュとマルチコア アーキテクチャに魅了されており、並列環境下でキャッシュがプログラムにどのように影響するかについて非常に興味があります。

一部の CPU モデル (たとえば、Intel Core Duo T5800) では、L2 キャッシュがコア間で共有されます。したがって、プログラムAが次のような物理アドレスでメモリにアクセスしている場合

0x00000000, 0x20000000, 0x40000000...

およびプログラム B でデータにアクセスする

0x10000000, 0x30000000, 0x50000000...

これらのアドレスは同じサフィックスを共有するため、L2 キャッシュ内の関連するセットは頻繁にフラッシュされます。また、2 つのプログラムが互いに競合し、キャッシュではなくメモリからゆっくりとデータを読み取ることが予想されますが、それらは異なるコアで分離されています。

それでは実際に結果を検証したいと思います。この実験では、仮想アドレスではなく物理アドレスを知る必要があります。しかし、どうすればこれに対処できますか?


最初の試み:

ヒープから大きなスペースを食べ、マスクし、特定のアドレスを取得します。

私の CPU にはサイズ = 2048KB で連想性 = 8 の L2 キャッシュがあるため、物理アドレスのようなもの0x12340000, 0x12380000, 0x123c0000は L2 キャッシュの最初のセットに関連付けられます。

int HEAP[200000000]={0};
int *v[2];
int main(int argc, char **argv) {

    v[0] = (int*)(((unsigned)(HEAP)+0x3fffc) & 0xfffc0000);
    v[1] = (int*) ((unsigned)(v[0]) + 0x40000); 

    // one program pollute v[0], another polluting v[1]
}

悲しいことに、仮想メモリの「助け」により、変数HEAPは物理メモリ内で常に連続しているわけではありません。異なるキャッシュ セットに関連している可能性がありますv[0]v[1]


2回目の試み

にアクセス/proc/self/memし、メモリ情報の取得を試みます。

うーん...結果はまだ仮想メモリについてのようです。

4

1 に答える 1

7

メモリとこれらのアドレスに関するあなたの理解は不完全/不正確です。基本的に、テストしようとしているものは無駄です。

ユーザー モード プロセスのコンテキストでは、表示されるほぼすべてのアドレスが仮想アドレスです。つまり、そのプロセスのコンテキストでのみ意味を持つアドレスです。OS は、この仮想メモリ空​​間 (プロセスに固有) がメモリ ページにマップされる場所のマッピングを管理します。これらのメモリ ページは常に、ページインされた (つまり、物理 RAM に存在する) ページにマップされる場合があります。または、ページアウトされてディスク上のスワップ ファイルにのみ存在する場合もあります

したがって、バックグラウンドの例に対処するために、これらのアドレスは 2 つの異なるプロセスからのものです。それらを比較しようとしてもまったく意味がありません。それらのコードがいずれかのキャッシュに存在するかどうかは、プロセッサのキャッシュ置換戦略、OS によって有効にされたキャッシュ ポリシー、他のプロセス (カーネル モード スレッドを含む) の数、等

最初の試みでは、実際に CPU キャッシュを直接テストする限り、どこにも到達しません。まず第一に、あなたの大きなバッファはヒープにはなりません。これは、実行可能ファイルのデータ セクション (具体的には .bss) の一部になります。ヒープは、一連malloc()のメモリ割り当てに使用されます。第二に、巨大な 1GB 領域を割り当てるかどうかは実際には問題ではありません。これは、プロセスの仮想アドレス空間で連続していますが、適切と思われる場所に仮想メモリのページを割り当てるのは OS 次第であるためです。実際に連続します。繰り返しますが、ユーザー空間からのメモリ割り当てをほとんど制御できません。" Linux でユーザー空間から連続した物理メモリを割り当てる方法はありますか?」 短い答えはノーです。

/proc/$pid/mapsどこにもあなたを連れて行くつもりはありません。はい、そこにはたくさんのアドレスがリストされていますが、繰り返しになりますが、それらはすべて process の仮想アドレス空間にあります$pid。これらに関する追加情報: Linux で /proc/$pid/mem から読み取るにはどうすればよいですか?

于 2012-12-19T07:01:49.513 に答える