Die Sequenz von Lade-/Speicherbefehlen arbeitet also mit den folgenden Blöcken:
Mem.Adr. | BlockAdr. | Tag/CacheAdr |
---|
L(0) | L(0) | 0*4+0 |
L(15) | L(7) | 1*4+3 |
S(16) | S(8) | 2*4+0 |
L(1) | L(0) | 0*4+0 |
L(14) | L(7) | 1*4+3 |
S(17) | S(8) | 2*4+0 |
L(2) | L(1) | 0*4+1 |
L(13) | L(6) | 1*4+2 |
S(18) | S(9) | 2*4+1 |
L(3) | L(1) | 0*4+1 |
L(12) | L(6) | 1*4+2 |
S(19) | S(9) | 2*4+1 |
L(4) | L(2) | 0*4+2 |
L(11) | L(5) | 1*4+1 |
S(20) | S(10) | 2*4+2 |
Damit wissen wir, welcher Block mit welchen beiden Wortadressen in den Cache geladen werden soll und wir wissen, in welcher Cache-Adresse dieser Block gefunden werden kann oder geladen werden muss. Dazu schauen wir an der Cache-Adresse nach, ob sich dort ein Block mit dem erwünschten Tag befindet. Wenn ja, haben wir den Block im Cache gefunden und haben einen Cache-Treffen. Wenn nein, dann muss der Block in den Cache geladen werden. Dazu muss evtl. erst ein vorhandener Block in den Speicher zurückgeschrieben werden. Um dies zu entscheiden, müssen wir uns merken, welche Blöcke verändert worden sind.