61464


私はコンピュータについて勉強中で、mallocについて以下のスライドと動画を見ていました。  
<https://www.slideshare.net/kosaki55tea/glibc-malloc> (スライド55ページ)  
<https://youtu.be/0-vWT-t0UHg?t=2758>

ここでは、以下のように述べています。（K&R mallocでは、たった今freeしたアドレスを、次のmalloc時のためのfree-
list舐めの開始アドレスに設定することについて）

>   * メモリーに一番アクセスする確率が高いのは malloc 直後と free 直前である
>   * free されたばかりのメモリはキャッシュに載ってる確率が高い
>   * そこから優先してメモリ確保することは malloc 直後のアクセスでキャッシュミスしなくなるということ
>

これは本当ですか？

freeされたばかりの領域のデータがキャッシュに乗っていたところで、次のmalloc直後のアクセスは書き込みであり読み込みでは無いと思われるので、利用されないのではないのでしょうか？


CC BY-SA 4.0
2019-12-15T05:47:55.483
61449
2020-01-23T13:03:15.440
2019-12-15T06:09:58.563
37013
37013
question
c++ linux c unix operating-system
K&R mallocに参照の局所性によるメリットはありますか？


リンク先の記事を書いた人に `キャッシュ` というのは `CPU の 2次キャッシュ` だという前提で書いてみます。

>
> freeされたばかりの領域のデータがキャッシュに乗っていたところで、次のmalloc直後のアクセスは書き込みであり読み込みでは無いと思われるので、利用されないのではないのでしょうか？

書き込みが発行した時に 2次キャッシュに空きがなければ、 空きを作る動作が 余計に必要となるため、それが、速度低下になるのではないでしょうか？。

実際には heap メモリで確保した領域付近には heap を管理するデータが格納されており、書き込む前に参照が発生すると思いますが・・。


CC BY-SA 4.0
2019-12-15T12:46:32.310
61459
2019-12-15T15:30:13.727
2019-12-15T15:30:13.727
18851
18851
61449
answer


書き込みの際には、該当キャッシュラインに対するRFO（Read For Ownership）と呼ばれるリード操作が生じるためです。

MESIプロトコル（キャッシュコヒーレントプロトコル）では、自身のキャッシュが最新のデータである状態（Modified状態とExclusive状態）にするために、自身以外のキャッシュに対して当該キャッシュラインの無効化ブロードキャストを行います。当該キャッシュライン全体を無効化するため、書き込み部以外の周辺データも保持する必要があり、そのための読み込みです。

もっと簡単に言うと、書き込みもキャッシュラインに合わせて行うため、書き込み部周辺のデータを一度リードする必要があるということです。


CC BY-SA 4.0
2019-12-15T17:16:12.847
61464
2019-12-15T17:16:12.847
37013
61449
answer