캐시가 세트를 선택하고 라인을 식별하는 메커니즘은 매우 단순합니다.
그럴 수밖에 없습니다 — 하드웨어는 이 과정을 수 나노초 단위로 수행해야 하기 때문입니다.
하지만 이런 비트 조작은 인간에게 혼란스러울 수 있으므로, 구체적인 예를 통해 과정을 살펴보겠습니다.
다음과 같은 직접 매핑 캐시가 있다고 가정합시다:
(S, E, B, m) = (4, 1, 2, 4)
즉,
4비트 주소 공간 전체를 나누어보면, 아래 그림(Figure 6.30)처럼
각 주소는 [Tag | Index | Offset] 비트로 구성됩니다.
Tag와 Index의 조합은 메모리의 각 블록을 유일하게 식별합니다.
예:
메모리 블록은 8개지만, 캐시 세트는 4개뿐이므로
여러 블록이 같은 세트에 매핑됩니다.
예:
같은 세트에 매핑된 블록들은 Tag 비트로 구분됩니다.
예:
| 주소(10진수) | Tag (t=1) | Index (s=2) | Offset (b=1) | 블록 번호(10진수) |
|---|---|---|---|---|
| 0 | 0 | 00 | 0 | 0 |
| 1 | 0 | 00 | 1 | 0 |
| 2 | 0 | 01 | 0 | 1 |
| 3 | 0 | 01 | 1 | 1 |
| 4 | 0 | 10 | 0 | 2 |
| 5 | 0 | 10 | 1 | 2 |
| 6 | 0 | 11 | 0 | 3 |
| 7 | 0 | 11 | 1 | 3 |
| 8 | 1 | 00 | 0 | 4 |
| 9 | 1 | 00 | 1 | 4 |
| 10 | 1 | 01 | 0 | 5 |
| 11 | 1 | 01 | 1 | 5 |
| 12 | 1 | 10 | 0 | 6 |
| 13 | 1 | 10 | 1 | 6 |
| 14 | 1 | 11 | 0 | 7 |
| 15 | 1 | 11 | 1 | 7 |
초기 상태: 캐시는 비어 있음 (모든 valid 비트 = 0)
| Set | Valid | Tag | block[0] | block[1] |
|---|---|---|---|---|
| 0 | 0 | |||
| 1 | 0 | |||
| 2 | 0 | |||
| 3 | 0 |
m[0], m[1]이 캐시로 복사됨.| Set | Valid | Tag | block[0] | block[1] |
|---|---|---|---|---|
| 0 | 1 | 0 | m[0] | m[1] |
| 1 | 0 | |||
| 2 | 0 | |||
| 3 | 0 |
m[1]) → cache hit| Set | Valid | Tag | block[0] | block[1] |
|---|---|---|---|---|
| 0 | 1 | 0 | m[0] | m[1] |
| 1 | 0 | |||
| 2 | 1 | 1 | m[12] | m[13] |
| 3 | 0 |
| Set | Valid | Tag | block[0] | block[1] |
|---|---|---|---|---|
| 0 | 1 | 1 | m[8] | m[9] |
| 1 | 0 | |||
| 2 | 1 | 1 | m[12] | m[13] |
| 3 | 0 |
| Set | Valid | Tag | block[0] | block[1] |
|---|---|---|---|---|
| 0 | 1 | 0 | m[0] | m[1] |
| 1 | 0 | |||
| 2 | 1 | 1 | m[12] | m[13] |
| 3 | 0 |
이와 같은 미스는 충돌 미스(conflict miss) 라고 부릅니다.
캐시 공간은 충분하지만, 서로 다른 블록들이 같은 세트에 매핑되어
계속 서로를 덮어쓰는 상황에서 발생합니다.