1

long pointerプログラムの物理メモリのメモリ位置に8バイトがあるとします。私のプログラムは小さく、完全にキャッシュに収まります。プログラムは簡単です。の物理メモリから任意のメモリ位置を(mmap()呼び出しを介して)マップし/dev/mem、その8バイト長のポインタを介してその位置に読み取りおよび書き込みを行うだけです。ただし、その場所は私のプログラムが物理メモリにある場所から非常に離れているため、L1/L2キャッシュはそのアドレスをカバーできません。

記事GettingPhysicalWith Memory(Gustavo Duarteによって書かれた、リンクできません)によると、メモリ書き込みは、そのメモリ位置を持つキャッシュラインがRAMに書き込む準備ができている場合にのみ発生します。

通常、カーネルはすべてのRAMメモリをライトバックとして扱い、最高のパフォーマンスを実現します。ライトバックモードでは、メモリアクセスの単位はキャッシュラインであり、Core 2では64バイトです。プログラムがメモリ内の1バイトを読み取る場合、プロセッサはそのバイトを含むキャッシュライン全体をL2およびL1キャッシュにロードします。プログラムがメモリに書き込むとき、プロセッサはキャッシュ内の行を変更するだけで、メインメモリは更新しません。後で、変更されたラインをバスにポストする必要が生じたときに、キャッシュライン全体が一度に書き込まれます

しかし、ターゲットのメモリ位置がキャッシュにない場合(上記で説明したように)、すぐに書き込まれますか?

4

1 に答える 1

1

あなたが引用する参照は、この状況で何が起こるかを説明しています-メモリアドレスが最近アクセスされておらず、まだキャッシュラインにロードされていない場合、その場所への読み取りはそのメモリ場所の内容になります-そしておそらく周辺の場所-キャッシュラインに読み込まれます。キャッシュに入ると、ある時点でメインメモリが変更されたキャッシュラインで更新されるまで、関連するメモリアドレスへの書き込みがこのキャッシュラインで行われます。

于 2013-02-27T08:42:29.030 に答える