본문 바로가기
2-2 학기/Computer Organization

[컴퓨터구조] Lec22 The Basic of Caches

by bona.com 2023. 12. 19.

✅Cache

: 자주 쓰이는 데이터를 저장하며, 매우 빠른 Access time을 지원하는 컴퓨터 메모리이다.

 

Cache를 찾는 과정을 소프트웨어적으로 해결 불가능

하드웨어적으로 해결을 해야 함

 

cache 메모리가 더 작기 때문에 메인 메모리에서 캐시 메모리로 빨리 바꿔줘야 함

→ 데이터를 빨리 보내는 방법 (address mapping)

 

Q. 데이터가 캐시 내에 있는지 어떻게 알 수 있는가? 🤔

Q. 알 수 있다면 어떻게 찾을 수 있는가? 🤔

  • 각 워드가 캐시 내의 딱 한 장소에만 있을 수 있다면 워드가 캐시 내에 있는지 없는지를 바로 알 수 있다.
  • 각 메모리 워드에 캐시 내의 위치를 할당하는 가장 간단한 방법은 그 워드의 메모리 주소를 이용하는 것이다.

 

☑️Direct Mapping

  • 모든 메모리 location은 하나의 cahce 메모리 location에 정확히 mapping 된다.

(메인 여러 개를 캐시에 하나에 공유할 수밖에 없음)'

 

캐시에서의 위치: main memory 주소 % 캐시 block의 개수 (몫 버림)

ex) 8개의 엔트리를 갖는 Direct Mapping 캐시

캐시 메모리는 3 비트

메인 메모리는 5비트

* 캐시 내에 8개의 엔트리가 있기 때문에 주소 X는 캐시 엔트리 X modulo 8에 사상된다. 즉 , 하위 log28 = 3비트들이 캐시의 인덱스로 사용된다.

 

ex) main memory : 22번지 캐시 block : 8개 ⇒ 캐시에서의 위치: 6 (22 % 8)

ex)

0 0 4 8 12

1 1 5 9 13
2 2 6 10 19
3 3 7 11 15

그런데 이렇게 하면 실제 메인 메모리 중에서 뭔지 알 수가 없음

캐시 블록이 유효한 정보를 가지고 있는지 알아내는 방법이 필요하다!

 

가장 많이 쓰이는 방법은 캐시 엔트리에 **유효 비트(valid bit)**를 추가해서 엔트리에 유효한 주소가 있는지를 표시하는 것이다.

앞의 2비트 (00, 01, 10, 11)로 main memory 중 어디인지 구분, 유효비트가 1이어야 접근하기 유효한 주소이다.

 

ex) cache = 1024 words , 1word = 4byte

offset = 2 bit, index = 10bit, tag = 20 bit

 

📌 인덱스 필드가 캐시를 접근하는 주소로 이용되고, n비트 필드는 2^n개의 값을 갖게 되므로, 직접 사상 캐시 전체 엔트리의 수는 2의 거듭제곱이 되어야 한다.

 

  • miss 했다. ⇒ 읽으려는 데이터가 캐시에 없다. (빨리 메인 메모리로 가서 값을 가져와야 함)
  • hit 했다. ⇒ 읽으려는 데이터가 캐시에 있다. (이미 값이 채워져 있을 떄 TAG 값을 보는데 같으면 HIT했다!)

  • 똑같아서 봤는데 태그 값 다르면 MISS 했다고 함. 그리고 버리고 새로운 값 다시 넣어줌

 

최종 정렬표

 

1️⃣ 1-워드 블록 캐시

  • 캐시 구성
    • 32 비트 메모리 주소
    • Direct Mapping 캐시
    • 캐시 블록: 1 워드=4 바이트
      • 바이트 오프셋(byte offset)=주소의 최하위 2 비트(캐시에서 사용하지 않는다)
    • 캐시 크기: 2^n 워드
      • 캐시 인덱스=n 비트
    • 태그 = 32 - (n+2) 비트
  • 캐시의 전체 비트 수 2^n x (유효 비트 크기+ 태그 크기 + 블록 크기 - 데이터의 크기) = 2n x (1 + (32-n-2) + 32) = 2n x (63-n)

 

📍4KiB 캐시 (블록 크기 = 1워드)

 

2️⃣2^m 워드 블록 캐시

  • 캐시 구성
    • 32 비트 메모리 주소
    • 직접 사상 캐시
    • 캐시 블록: 2^m 워드
      • 블록 오프셋(block offset)=m 비트
    • 캐시 블록 개수: 2^n
      • 캐시 인덱스=n 비트
    • 캐시 크기: 2n+m 워드
    • 태그 = 32 - (n+m+2) 비트
  • 캐시의 전체 비트 수 2^n x (유효 비트 크기+ 태그 크기 + 블록 크기) = 2n x (1 + (32-n-m-2) + 2mx32) = 2n x (31-n-m + 2mx32)

 

📍2^m 워드 블록 캐시의 예

 

명령어를 4개씩 불러들여옴

0에서 255까지

2^12 / 2^4 니까

 

☑️Miss rate vs. Block size

  • 블록을 크게 하면

⇒ 공간적 지역성 증가

⇒ 실패율 감소

⇒ 실패 손실 증가

 

  • 블록이 너무 클 경우

⇒ 캐시 내의 블록이 너무 적다.

⇒ 블록 내 워드 간의 공간적 지역성 감소

⇒ 실패율 증가

 

☑️캐시의 실패 처리

  1. 원래의 PC 값 (PC-4)을 메모리로 보낸다.
  2. 메인 메모리에 읽기 동작을 지시하고 메모리가 접근을 끝낼 떄까지 기다린다.
  3. 캐시 엔트리에 쓴다. 이떄 메모리에서 인출한 데이터를 데이터 부분에 쓰고, 태그 필드에 주소의 상위 비트를 쓰고, 유효 비트를 1로 한다.
  4. 명령어 수행을 첫 단계부터 다시 시작한다. 캐시에서 명령어를 다시 인출하는데, 이번에는 필요한 명령어를 캐시에서 찾을 수 있다.

 

☑️쓰기의 처리

1️⃣즉시 쓰기

📍즉시 쓰기

  • 캐시와 메모리에 동시에 쓰는 방식 (항상)
  • 두 계층의 데이터가 항상 일치(consistent)
  • 단, 시간이 오래 걸림
  • 쓰기 실패의 처리
    • 메모리에서 해당 워드가 포함된 블록을 가져와서 캐시에 넣고, 이 워드에 쓰기 수행
    • 또한 전체 주소를 사용하여 이 워드를 메인 메모리에도 쓴다.
  • 성능 저하
    • 쓰기 할 때마다 메인 메모리 접근 필요

📍쓰기 버퍼

  • 메모리에 쓰이기 위해 기다리는 동안 데이터를 저장하는 큐
  • 캐시와 쓰기 버퍼에 쓰고 나면, 프로세서는 즉시 수행 계속
  • 쓰기 버퍼가 꽉 차 있을 때만 정지

 

2️⃣나중 쓰기

  • 새로운 값은 일단 캐시에만 쓰고, 나중에 캐시에서 쫓겨날 때 메모리에 쓴다.
  • 갱신 비트 (dirty bit 또는 modified bit)
  • 즉시 쓰기보다 성능이 좋다.
  • 대신 구현이 더 어렵다