正確な答えは、システムの実装など、あまりにも多くのパラメータに依存しますが、私は1ヶ月だったので私の直感をつかむようにします。
あなたはすでにこれを知っているが、私はa
は67バイトの大きさを持っていることに注意してみましょうことがあります。
#include <stdio.h>
int main(void)
{
unsigned char a[67] = {0};
printf("%zu\n", sizeof(a)); // prints 67
return 0;
}
当社のキャッシュは64バイトなので、のは、それが64を保持できると仮定しましょうそれが完全に空のときa
の細胞。
コードのループが実行を開始します。i
は変数で、ではなく、がキャッシュされると仮定して、簡単に答えを出します。
あなたのコードはa[i]
にアクセスしようとするので、私たちは、キャッシュ内のルックアップが、何も見えない(キャッシュはプログラムの開始時に、すなわち常に、空であるときには、コールドスタートと呼ばれ、キャッシュミスのために強制的に)。
a
の最初の64バイトは、OSがアレイ全体を1として扱うと仮定して、キャッシュにコピーされます。
a[i]
をi = 0で更新しました。a[i]
に再度アクセスすると、そのビットはダーティとマークされ、キャッシュルックアップはミスになります。
Nextループ、我々はキャッシュをチェックし、a[1]
をしたい、万歳!、それはすでにありますので、我々は、キャッシュヒットを持っています。そして、配列全体が収まりきらないので、キャッシュにないa[64]
をリクエストするまで続きます。
OSはa[64]
をフェッチしますが、a[65]
とa[66]
も同様に取得する可能性があるため、問題は誰に置き換えの対象になるのでしょうか。
担当する置換ポリシーで犠牲者を選択し、a[65]
を要求すると、a[64]
と一緒にフェッチされたと仮定すると、キャッシュヒットします。
何が起こるかの非常に近似し、何とか不正確概要でしたが、ここでのポイントは、あなたの直感を与えることです、それは助けを願ってい
! :)