본문 바로가기
ੈ✩‧₊˚Computer Science/컴퓨터구조

[컴퓨터구조] 캐시(Cache)

by 샨샨 2020. 11. 20.
반응형

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

 

기본적 캐시 구조

 

- direct mapped : cache와 main memory 간에 mapping 이 되어있는 것 , cache를 통해 main memory data를 가져와야 한다

▶ 캐시에서의 위치 : main memory 주소 % 캐시 block의 개수

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

하지만 이 방법은 main memory의 여러 주소가 한 곳의 캐시에 들어가게 되는데, 캐시에서 그 값이 main memory 중 어디를 가르키는지 알려면 어떻게 해야할까?

답) 유효비트(valid bit)와 tag를 이용한다.

 

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

 

direct mapped cache 구조

- 20 bit : tag 구분을 위해

- 10 bit : 2^10 개의 cache block의 Index를 위해

- 2 bit : 4 byte offset을 위해 (00,01,10,11) -> 1word = 4byte 이고 메모리의 용량을 1024word라고 결정하면 그 안에서 4byte를 구분해주는 요소가 필요 , 그게바로 2bit

 

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

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

 

cache 용량 = (32bit (데이터) + 20bit(tag) + 1bit(valid) *1024)

 

blocksize가 1 word (=4 bytes) 일 때, 

식이 성립한다.

 

HIT & MISS

Read Hits : 읽으려는 데이터가 캐시에 있다.

Read Miss : 읽으려는 데이터가 캐시에 없다. (CPU 정지 -> memory로 부터 block을 가져옴 -> 캐시로 block 전달 -> CPU 재시작)

 

■ CPU 정지 = memory로 부터 데이터를 받아오기를 기다리며 내부의 모든 레지스터를 동결

separate controller가 캐시 miss에 대한 행동을 수행한다. (메인 메모리로부터 데이터 fetch, 메모리를 캐시에 넣음)

■ 데이터 저장 후, CPU 재실행

 

Handling cache miss

이전에, instruction memory와 data memory를 나눴었다. 따라서 캐시도 instruction 캐시와, data 캐시로 나눈다.

 

Read miss 일 때,

[instruction cache] - write 동작 없음 ( memory에 새로운 데이터를 입력하기만 하면 된다.)

1.PC - 4를 해서 돌아간다.

2. CPU stall, 메모리로부터 block을 받는다.

3.cache에 block을 입력, valid bit = 1

4. instruction execution 재실행

 

[data cache] - 읽기, 쓰기 둘다함

cache하고 memory하고 내용이 일치를 안할 수도 있다.

miss 가 나서 새로 data를 저장하게 되는데, 이때 옛날 값(old block)을 어떻게 해야할까?

답) write policy 에 따라 다르다.(옛날값 저장 or 그냥 버림)

 

 

write policy

▶ write through : cache의 block과 main memory의 block을 동시에 update

- miss일 때, old block 걍 버림

- 고로, miss일 때 속도가 빠름

- 오히려 hit 일 때, cache와 main memory 모두 update해야해서 시간이 더 걸림, memory에 계속 접근함

☞ 메모리 접근이 적다는 캐시의 장점이 없어진다.

 

▶ write back : cache만 update, main memory에서 데이터를 갖다쓸 일이 새기면, 바뀐 cache값을 main memory에 저장

- Dirty : Dirty bit = 1

cache block에 새로운 데이터가 write되었을 때 (main 에는 old block 유지)

main 에서 메모리를 갖다쓸일이 생기면 write back을 한다.

 

- Clean : Dirty Bit = 0

cache block이 업데이트 되지 않은 상황

write back 필요 없음

 

-> cache의 크기는 조금 늘어나지만, memory access가 줄어드는 방식

 

Write

Write through는 write buffer를 이용한다. 왜냐하면 cache와 main memory를 같이쓰는데, memory 접근은 속도가 굉장히 느리기 때문에 buffer에 write할 데이터를 쌓아놓는다.

-processor : 데이터를 cache와 buffer에 write

-memory controller : buffer의 데이터를 main memory(DRAM)으로 전송

 

Read Hit : 우리가 원하는 것이 cache에 있다.

Read miss : 우리가 원하는 것이 cache에 없다.

 

 

miss 가 난 번지만 업데이트하는 것이 아니고, 1 block을 다 업데이트 해야한다. (1 block은 1word, 2word 등 다양할 수 있다.)

data는 block단위로 이동한다(spatial locality)

miss penalty 는 위치를 탐색하는 시간 + read하는 시간 + cache에서 다른 메모리 쫒아내는 데 걸리는 시간 

=> memory read + memory write하는 시간

 

 

64KB = 2의 16승 , address = 16bit

cache의 한 block의 크기 8 byte = > 구분하려면 3bit 필요

cache entry : 2의 8승 (8bit 필요)

byte offset = 3bit

index = 8bit

tag = 16 - 8 - 3

data의 크기는? 1 block의 크기가 8byte니까 64bit

 

 

1byte 는 8 bit

 

valid가 0 이면 태그가 맞아도 못쓰는 주소임

 

 

 

 

반응형