long pointer
プログラムの物理メモリのメモリ位置に8バイトがあるとします。私のプログラムは小さく、完全にキャッシュに収まります。プログラムは簡単です。の物理メモリから任意のメモリ位置を(mmap()呼び出しを介して)マップし/dev/mem
、その8バイト長のポインタを介してその位置に読み取りおよび書き込みを行うだけです。ただし、その場所は私のプログラムが物理メモリにある場所から非常に離れているため、L1/L2キャッシュはそのアドレスをカバーできません。
記事GettingPhysicalWith Memory(Gustavo Duarteによって書かれた、リンクできません)によると、メモリ書き込みは、そのメモリ位置を持つキャッシュラインがRAMに書き込む準備ができている場合にのみ発生します。
通常、カーネルはすべてのRAMメモリをライトバックとして扱い、最高のパフォーマンスを実現します。ライトバックモードでは、メモリアクセスの単位はキャッシュラインであり、Core 2では64バイトです。プログラムがメモリ内の1バイトを読み取る場合、プロセッサはそのバイトを含むキャッシュライン全体をL2およびL1キャッシュにロードします。プログラムがメモリに書き込むとき、プロセッサはキャッシュ内の行を変更するだけで、メインメモリは更新しません。後で、変更されたラインをバスにポストする必要が生じたときに、キャッシュライン全体が一度に書き込まれます
しかし、ターゲットのメモリ位置がキャッシュにない場合(上記で説明したように)、すぐに書き込まれますか?