✅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
- 블록을 크게 하면
⇒ 공간적 지역성 증가
⇒ 실패율 감소
⇒ 실패 손실 증가
- 블록이 너무 클 경우
⇒ 캐시 내의 블록이 너무 적다.
⇒ 블록 내 워드 간의 공간적 지역성 감소
⇒ 실패율 증가
☑️캐시의 실패 처리
- 원래의 PC 값 (PC-4)을 메모리로 보낸다.
- 메인 메모리에 읽기 동작을 지시하고 메모리가 접근을 끝낼 떄까지 기다린다.
- 캐시 엔트리에 쓴다. 이떄 메모리에서 인출한 데이터를 데이터 부분에 쓰고, 태그 필드에 주소의 상위 비트를 쓰고, 유효 비트를 1로 한다.
- 명령어 수행을 첫 단계부터 다시 시작한다. 캐시에서 명령어를 다시 인출하는데, 이번에는 필요한 명령어를 캐시에서 찾을 수 있다.
☑️쓰기의 처리
1️⃣즉시 쓰기
📍즉시 쓰기
- 캐시와 메모리에 동시에 쓰는 방식 (항상)
- 두 계층의 데이터가 항상 일치(consistent)
- 단, 시간이 오래 걸림
- 쓰기 실패의 처리
- 메모리에서 해당 워드가 포함된 블록을 가져와서 캐시에 넣고, 이 워드에 쓰기 수행
- 또한 전체 주소를 사용하여 이 워드를 메인 메모리에도 쓴다.
- 성능 저하
- 쓰기 할 때마다 메인 메모리 접근 필요
📍쓰기 버퍼
- 메모리에 쓰이기 위해 기다리는 동안 데이터를 저장하는 큐
- 캐시와 쓰기 버퍼에 쓰고 나면, 프로세서는 즉시 수행 계속
- 쓰기 버퍼가 꽉 차 있을 때만 정지
2️⃣나중 쓰기
- 새로운 값은 일단 캐시에만 쓰고, 나중에 캐시에서 쫓겨날 때 메모리에 쓴다.
- 갱신 비트 (dirty bit 또는 modified bit)
- 즉시 쓰기보다 성능이 좋다.
- 대신 구현이 더 어렵다
'2-2 학기 > Computer Organization' 카테고리의 다른 글
[컴퓨터구조] Lec19 Control Hazards (0) | 2023.12.19 |
---|---|
[컴퓨터구조] Lec17, Lec18 Data Hazards (0) | 2023.12.19 |
[컴퓨터구조] Lec16 Pipelined Datapath and Control (1) | 2023.12.19 |
[컴퓨터구조] Lec15 Pipelining (1) | 2023.11.01 |
[컴퓨터구조] Lec12 Datapath Design (0) | 2023.10.30 |