質問: 私はコンピュータについて勉強中で、mallocについて以下のスライドと動画を見ていました。 (スライド55ページ) ここでは、以下のように述べています。(K&R mallocでは、たった今freeしたアドレスを、次のmalloc時のためのfree-list舐めの開始アドレスに設定することについて) > > * メモリーに一番アクセスする確率が高いのは malloc 直後と free 直前である > * free されたばかりのメモリはキャッシュに載ってる確率が高い > * そこから優先してメモリ確保することは malloc 直後のアクセスでキャッシュミスしなくなるということ > > > これは本当ですか? freeされたばかりの領域のデータがキャッシュに乗っていたところで、次のmalloc直後のアクセスは書き込みであり読み込みでは無いと思われるので、利用されないのではないのでしょうか?
回答: 書き込みの際には、該当キャッシュラインに対するRFO(Read For Ownership)と呼ばれるリード操作が生じるためです。 MESIプロトコル(キャッシュコヒーレントプロトコル)では、自身のキャッシュが最新のデータである状態(Modified状態とExclusive状態)にするために、自身以外のキャッシュに対して当該キャッシュラインの無効化ブロードキャストを行います。当該キャッシュライン全体を無効化するため、書き込み部以外の周辺データも保持する必要があり、そのための読み込みです。 もっと簡単に言うと、書き込みもキャッシュラインに合わせて行うため、書き込み部周辺のデータを一度リードする必要があるということです。