도구스개발

캐시 사상·히트율 계산기

캐시 크기와 블록 크기, 연관도에서 주소의 태그·인덱스·오프셋 비트를 쪼개고 접근 순서로 히트율을 계산합니다. 미스를 강제·용량·충돌로 갈라 어디를 손대야 하는지 알려 줍니다.

한 번에 올려 오는 덩어리입니다. 오프셋 비트를 정합니다.

1이면 직접 사상, 블록 수와 같으면 완전 연관입니다.

비트

직접 사상 — 주소 쪼개기

태그 18 · 인덱스 9 · 오프셋 5

블록 512개 · 집합 512개 · 1-way

전체 블록 수 (캐시 ÷ 블록)512개
집합 수 (블록 ÷ 연관도)512개
오프셋 비트 = log₂(블록 크기)5비트
인덱스 비트 = log₂(집합 수)9비트
태그 비트 = 주소 − 인덱스 − 오프셋18비트
태그·유효비트 오버헤드1,216바이트 (데이터의 7.4%)

주소 0 (0x0)를 이 캐시로 쪼개면

000000000000000000 | 000000000 | 00000

태그 18비트 · 인덱스 9비트 · 오프셋 5비트

인덱스는 «블록 수»가 아니라 «집합 수»의 로그입니다. 여기서 가장 많이 틀립니다. 연관도를 올리면 한 집합에 블록이 여럿 들어가 집합 수가 줄고, 인덱스가 짧아진 만큼 태그가 길어집니다. 지금 1-way에서 인덱스 9비트·태그 18비트인데, 연관도를 두 배로 하면 인덱스가 하나 줄고 태그가 하나 늘어납니다. 완전 연관은 집합이 하나뿐이라 인덱스가 아예 0비트입니다.

10진수 또는 0x 16진수를 공백·쉼표로 구분합니다.

히트율33.3% (2/6)
강제 미스 (처음 보는 블록)3회
충돌 미스 (자리가 겹쳐서)1회
용량 미스 (캐시가 작아서)0회
주소블록집합태그결과밀려난 블록
0000강제 미스
32110강제 미스
0000히트
16,38451201강제 미스0
0000충돌 미스512
32110히트
미스를 원인별로 갈라야 손댈 곳이 정해집니다. 처음 보는 블록이라 어쩔 수 없는 것이 «강제», 캐시가 통째로 작아 밀려난 것이 «용량», 자리는 남는데 그 자리가 겹쳐 밀려난 것이 «충돌»입니다. 판정은 같은 용량의 완전 연관 캐시를 나란히 굴려, 거기서 히트였으면 충돌로 봅니다. 충돌 미스는 연관도를 올리면 사라지고, 용량 미스는 캐시를 키워야 합니다. 강제 미스는 어느 쪽으로도 못 막습니다 — 블록을 키워 한 번에 더 많이 올려 오는 것만 도움이 됩니다.
같은 블록 안의 다른 주소는 공짜입니다. 블록 하나가 32바이트이므로 주소 31까지는 모두 같은 블록입니다. 배열을 순서대로 훑을 때 빠른 이유가 이것이고(공간 지역성), 블록을 키우면 강제 미스가 줄어듭니다. 다만 블록이 너무 크면 쓰지도 않을 데이터를 함께 올려 와 블록 수가 줄어들고, 그만큼 다른 데이터가 밀려나 미스가 오히려 늘 수 있습니다.
교체는 LRU로 봅니다. 실제 하드웨어는 완전한 LRU가 비싸서 유사 LRU나 랜덤을 쓰는 일이 많아, 실측 히트율은 이 값보다 조금 나쁜 쪽으로 나옵니다. 쓰기 정책(write-back /write-through)과 쓰기 할당 여부도 실제 미스율에 영향을 주지만 여기서는 읽기만 봅니다.

사용 방법

  1. 1캐시 크기와 블록 크기, 연관도를 고릅니다.
  2. 2주소의 태그·인덱스·오프셋 비트 폭과 예시 주소의 실제 분해를 확인합니다.
  3. 3접근할 주소 순서를 넣으면 각 접근이 히트인지 미스인지, 어떤 블록이 밀려나는지가 나옵니다.
  4. 4미스가 충돌인지 용량인지 보고 연관도를 올릴지 캐시를 키울지 정합니다.

자주 묻는 질문

오프셋 = log₂(블록 크기), 인덱스 = log₂(집합 수), 태그 = 주소 비트 − 인덱스 − 오프셋입니다. 집합 수는 전체 블록 수를 연관도로 나눈 값입니다. 32비트 주소에 16KB 캐시·32바이트 블록·직접 사상이면 오프셋 5비트, 인덱스 9비트, 태그 18비트가 됩니다.

직접 사상일 때만 우연히 맞습니다. 인덱스는 «집합 수»의 로그이며, 직접 사상에서는 집합 수와 블록 수가 같아서 구분이 드러나지 않을 뿐입니다. 연관도를 올리면 한 집합에 블록이 여럿 들어가 집합 수가 줄고, 인덱스가 짧아진 만큼 태그가 길어집니다.

0개입니다. 집합이 하나뿐이라 고를 집합이 없기 때문이며, 주소는 태그와 오프셋으로만 나뉩니다. 대신 어느 블록에 있는지 찾으려면 모든 태그를 동시에 견주어야 해서 비교기가 블록 수만큼 필요하고, 그래서 큰 캐시에는 쓰지 않습니다.

처음 보는 블록이면 강제 미스, 아니면 같은 용량의 완전 연관 캐시에서 히트였는지로 가릅니다. 거기서 히트였다면 자리 다툼 탓이므로 충돌, 거기서도 미스였다면 캐시가 통째로 작은 것이므로 용량 미스입니다. 충돌 미스는 연관도를 올리면 사라지고, 용량 미스는 캐시를 키워야 합니다.

아닙니다. 블록을 키우면 한 번에 더 많이 올려 와 강제 미스가 줄지만, 같은 용량에서 블록 수가 줄어 자리 다툼이 심해집니다. 쓰지도 않을 데이터를 함께 올려 오는 낭비도 커집니다. 그래서 실제 캐시는 32~128바이트 언저리에서 절충합니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 교체 정책은 LRU로 봅니다. 실제 하드웨어는 완전한 LRU가 비싸 유사 LRU나 랜덤을 쓰는 일이 많아, 실측 히트율은 이 값보다 조금 나쁜 쪽으로 나옵니다.
  • 읽기 접근만 봅니다. 쓰기 정책(write-back/write-through)과 쓰기 할당 여부도 실제 미스율과 메모리 통행량을 바꿉니다.
  • 3C 분류는 Hill & Smith의 고전적 방법으로, 완전 연관 LRU를 기준으로 삼습니다. 기준을 어떻게 잡느냐에 따라 용량과 충돌의 경계가 조금씩 달라지는 정의도 있습니다.
  • 캐시 크기·블록 크기·연관도는 모두 2의 거듭제곱이어야 합니다. 실제 하드웨어도 비트 쪼개기로 주소를 나누기 때문에 이 제약이 그대로 있습니다.
  • 주소 순서는 200개까지 봅니다. 실제 프로그램의 지역성은 이보다 훨씬 긴 흐름에서 드러나므로, 여기 히트율은 규칙을 이해하기 위한 것이지 성능 예측치가 아닙니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.