컴퓨터구조

[컴퓨터 구조] cache memory

hccode0419 2025. 1. 2. 22:30

1. cache memory

cache는 CPU core와 memory 사이에서 자주 사용하는 데이터를 미리 준비해 두는 저장소이다.
 

이해를 돕기 위한 간략한 구조도이다. (완변학 구조가 아님)

cpu에서 main memory로 데이터를 요청하면 그 시간만큼 clock cycle이 소모된다. 또한 속도가 빠른 CPU와 느린 메모리의 속도차를 완화하는 역할을 한다.
 
그래서 자주 사용하는 데이터를 미리 더 가까운 곳에 저장해서 사용하는 것이다.
 
cache는 L1, L2, L3 cache로 나뉜다. 
L1은 d-cache, i-cache로 나뉘는데 각각 data, 명령어를 저장하는 cache다.

Intel Core i7 cache hierarchy

 
CPU 제조사 마다 L1 또는 L2가 core 내부에 위치할 수도 외부에 위치할 수도 있다.
 
memory hierarchy 참고
링크 :


2. locality

cache를 저장할 때는 두 가지 원리에 따라서 저장된다.
 

1) temporal locality

최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.
 

2) spatial locality

접근한 메모리 공간 근처를 접근하려는 경향
 
위의 두 가지 원리에 의해 cache에 저장한다. 


3. his & miss

1) hit : CPU가 읽어오려는 data가 cache에 있을 때

- cache에 data가 있으므로 memory에 접근하지 않는다. 
 
이때 CPU가 요청한 data 중 cache에 저장된 비율을 hit rate라고 한다.
 
cache를 설계할 때는 hit rate가 높아지도록 설계해야 성능이 높은 CPU가 될 수 있다.
 

2) miss: CPU가 읽어오려는 data가 cache에 있을 때

- L1에서 miss가 일어날 경우 L2로, L2에는 L3로, L3에서 miss가 일어나면 memory에 접근한다.
 

3) miss type

일반적으로 알려진 miss가 일어나는 경우다.
 
- compulsory miss : 가장 초기에 cache memory가 비어있을 때 나타나는 miss
 
- capacity miss : 용량 부족 문제로 나타나는 miss
 
- conflict miss : 여러 data block이 동시에 mapping될 때, 즉 cache에 이미 데이터가 있을 경우 나타나는 miss
ex) cache에 이미 data A가 저장되어 있는데 같은 곳에 data B를 저장할 경우에 conflict miss가 일어난다.
 


4. cache 내부 구조

cache의 내부 구조

 
cache는  S개의 집합으로 이루어져 있고, 그 집합은 E개의 line으로 구성되어있다. 
 
각 line은 valid bit, tag, cache block(data)로 이루어져 있다.
 
valid bit : 블럭이 유효한지 확인
tag : 블럭을 구분하기 위한 tag 
cache block : data
 
 
- cache memory의 사이즈 : S * E * B (set의 개수 * 각 set에 있는 line의 개수 * 각 라인의 블럭의 크기)


5. cache 작동 방식

지금까지 cache가 무엇인지 알았다면 이제부터 cache가 어떻게 작동되는지 알아보자. 
 

1) direct mapped cache

direct mapped cache는 가장 기본적인 cache 구조로 E가 1인 경우이다.(즉 각 set에 하나의 line만 있는 경우).
 
1-1) 작동 방식
 
① 먼저 어떤 set에 저장할지 결정한다.

 
주어진 int형 주소에서 index를 결정하는 부분이 0...01이므로 1번째 위치의 set에 저장한다.
 
② tag bit를 확인한다.

 
주어진 int형 주소에서 tag 부분을 확인하여 cache의 tag bit와 일치한 지 확인한다.
 
만약 tag가 일치하지 않는다면 miss가 일어난 것이고 이전 데이터를 지우고 새로운 데이터(주어진 int형 주소)로 교체한다.
 
③ cache block을 확인한다.

 
int형 주소이기 때문에 4개를 확인한다. 
 
1-2) 예제 문제
 
위의 3단계를 통해 예제 문제를 풀어보자.

더보기

4bit address
S = 4
E = 1
B = 2

위 상황으로 가정하여 예제를 풀어보자.(위의 더보기를 클릭)
 
address는 아래와 같이 4bit로 주어진다.

① 초기 상태

 
가장 처음에는 아무 data도 없기 때문에 valid bit(V)는 다 0이고, 나머지들도 아무것도 없다.
 
 
② 0000

0000이 입력되면 먼저 set을 결정한다. 
 
0000의 중간 두 개의 bit가 00이므로 set 0에 저장된다.
 
이후 valid bit가 1로 변경하고, tag를 저장한다.
 
Block에는 memory의 0, 1번째가 저장되는데 이는 0000(십진수로 0)이 입력됐기 때문이다. 
 
이때 0과 1 두 개가 저장되는 이유는 처음 설정에서 B를 2로 가정했기 때문이다. 
 
그리고 이때 cache에 아무런 데이터가 없기 때문에 compulsory miss가 일어난다.
 
 
③ 0011

 
0011이 입력되면 먼저 set을 결정한다. 
 
0011의 중간 두 개의 bit가 01이므로 set 1에 저장된다.
 
이후 valid bit가 1로 변경하고, tag를 저장한다.
 
Block에는 memory의 2, 3번째가 저장되는데 이는 0011(십진수로 3)이 입력됐기 때문이다. 
 
그리고 이때 cache에 아무런 데이터가 없기 때문에 compulsory miss가 일어난다.
 
④ 0111

 
0111이 입력되면 먼저 set을 결정한다. 
 
0111의 중간 두 개의 bit가 11이므로 set 3에 저장된다.
 
이후 valid bit가 1로 변경하고, tag를 저장한다.
 
Block에는 memory의 6, 7번째가 저장되는데 이는 0111(십진수로 7)이 입력됐기 때문이다. 
 
그리고 이때 cache에 아무런 데이터가 없기 때문에 compulsory miss가 일어난다.
 
 
⑤ 0110

 
0110이 입력되면 먼저 set을 결정한다. 
 
0110의 중간 두 개의 bit가 11이므로 set 3에 저장된다.
 
하지만 지금의 경우 이미 set 3에 데이터가 저장되어 있다. 
 
이때는 먼저 valid bit가 1인지 확인한 후 tag가 이전 데이터와 일치하는지 확인한다. 
 
지금의 경우 tag가 0으로 이전과 일치한다.
 
data block을 확인해 보니 6이라는 데이터가 이미 저장되어 있다.
 
이는 찾으려는 data가 이미 cache에 저장되어 있는 것으로 hit된 것을 알 수 있다.
 
→ data가 이미 저장되어 있으면, V, tag, data block을 확인해서 데이터가 일치하면 hit, 아니면 conflict miss다.
 
 
⑥ 1000

1000이 입력되면 먼저 set을 결정한다. 
 
1000의 중간 두 개의 bit가 00이므로 set 0에 저장된다.
 
하지만 지금의 경우 이미 set 0에 데이터가 저장되어 있다. 
 
위와 마찬가지로 먼저 먼저 valid bit가 1인지 확인한 후 tag가 이전 데이터와 일치하는지 확인한다. 
 
지금의 경우 tag가 1으로 이전과 일치 하지 않는 것을 볼 수 있다.
 
이는 찾으려는 data가 cache에 없는 것을 의미하며 이때 conflict miss가 일어난다.
 
이후 tag와 data block을 업데이트한다.
 
 
⑦ 결론
 
결론적으로 5가지 과정을 거치면서 cache memory에는 아래와 같은 data가 저장됐다.

 
또한 hit/miss를 비교해보면 다음과 같다.

 
처음 0, 3, 7이 입력될 때는 compulsory miss가 일어났으며, 6이 입력될 때는 cache에 해당 data가 이미 있어서 hit이 일어났다.
마지막 8이 입력될 때는 이미 set에 data가 있어서 tag와 data를 비교했더니, 일치하지 않는 data라서 conflict miss가 일어난 것을 확인할 수 있다.


2) n-way set associative

n-way set associative는 E가 2개 이상인 것이다.(즉 각 set에 2개 이상의 line이 있다.)
 
2-1) 작동 방식
 
① 먼저 어떤 set에 저장할지 결정한다.

 
주어진 short int형 주소에서 index를 결정하는 부분이 0...01이므로 1번째 위치의 set에 저장한다.
 
② tag bit를 확인한다.

주어진 short int형 주소에서 tag 부분을 확인하여 cache의 tag bit와 일치한 것을 찾는다. 
 
만약 모든 tag가 일치하지 않는다면 miss가 일어난 것이고 이전 데이터를 지우고 새로운 데이터(주어진 short int형 주소)로 교체한다.
 
③ cache block을 확인한다.

short int형 주소이기 때문에 2개를 확인한다. 
 
2-2) 예제 문제
기본적인 방법은 위의 direct mapped cache와 동일하다. 
 

더보기

4bit address
S = 2
E = 2
B = 2

위 상황으로 가정하여 예제를 풀어보자.(위의 더보기를 클릭)
 
address는 아래와 같이 4bit로 주어진다.

① 초기 상태

 
가장 처음에는 아무 data도 없기 때문에 valid bit(V)는 다 0이고, 나머지들도 아무것도 없다.
 
② 0000

0000이 입력되면 먼저 set을 결정한다. 
 
0000의 두 번째의 bit가 0이므로 set 0에 저장된다.
 
이후 valid bit가 1로 변경하고, tag를 저장한다.
 
Block에는 memory의 0, 1번째가 저장되는데 이는 0000(십진수로 0)이 입력됐기 때문이다. 
 
이때 0과 1 두 개가 저장되는 이유는 처음 설정에서 B를 2로 가정했기 때문이다. 
 
그리고 이때 cache에 아무런 데이터가 없기 때문에 compulsory miss가 일어난다.
 
③ 0011

 
set : 1
tag : 00
data : M[2-3]
 
cache에 아무런 데이터가 없기 때문에 compulsory miss가 일어난다.
 
④ 0111

 
set은 1이고 tag는 01이다. 
만약 이때 tag가 00이었을 경우 기존에 있던 것과 같은 tag이므로 비교해서 hit/miss 여부를 판단했을 것이다.
data : M[6-7]
 
cache에 아무런 데이터가 없기 때문에 compulsory miss가 일어난다.
 
⑤ 0110

 
set이 1이고 tag도 01이다.
cache에 이미 있는 set과 tag이므로 비교해야한다. 
 
이때 data block에 6이 있으므로 이때는 hit가 나타난다.
 
 
⑥ 1000

 
지금까지 해왔던 방법으로 1000을 세팅하면
set은 0이고 tag는 10이다. 
 
⑦ 결론
 
결론적으로 5가지 과정을 거치면서 cache memory에는 아래와 같은 data가 저장됐다.

 
또한 hit/miss를 비교하면 다음과 같다.
 

 
0, 3, 7, 8이 모두 compulsory miss고, 6일 때 hit이 나타났다.
 

3) fully associative

마지막으로 fully associative은 set은 하나만 있고 그 set안에 모든 line이 있는 것이다.
 
단순하게 말해서 그냥 마음대로 저장하는 것이다. 
 
아래 예시를 통해 보자.

 
처음 0이 들어갈 때는 그냥 M[0]에 넣었고, 8이 들어갈 때는 그냥 그 다음 장소에 M[8]을 넣었다.
또 다시 0을 확인할 때는 hit이 된 것을 볼 수 있고 6이 들어갈 때는 없으니 다음 장소에 넣었다.
 
이런 방식으로 넣는 것이 fully associative다.
 
물론 위의 예시는 너무 단순하게 표현한 것이라 실제로는 tag와 v를 확인하면서 진행한다.


6. write policy

마지막으로, cache의 write policy을 알아보자.
hit : write through, write back
miss : write allocate, no write allocate
 

1) write through

cache memory에 data가 write될 때 main memory도 똑같이 수정하는 방법이다. 
 
즉, cache와 main memory를 동시에 수정하는 방법이다. 
 
장점 : cache의 일관성을 잘 유지할 수 있다.
 
단점 : cache와 memory를 둘 다 수정하기 때문에 처리 속도가 느리다. 
 

2) write back

write back은 일단 cache memory에만 data를 write하고 있다가, cache가 새로운 data block으로 교체될 때(즉  tag를 비교했을 때 다른 데이터가 들어올 때) main memory에 data를 write하는 방법이다.
 
각 line마다 cache block이 수정되었는지 확인하는 dirty bit가 필요하다. 
 
장점 : write through 보다 처리 속도가 빠르다.
 
단점 : 구현이 어렵고, 변경된 data를 기억하여 main memory에 수정해야하기 때문에 일관성을 유지하기 쉽지 않다.
 
 

3) write allocate

write miss가 발생할 때 바로 새로운 data block을 불러오는 정책이다.
 

4) no write allocate

write miss가 발생할 때 cache는 로드하지 않고 main memory에 바로 접근한다.
 
 
일반적으로 write through와 no write allocate를 함께 쓰고, write back과 write allocate를 함께 사용한다.

'컴퓨터구조' 카테고리의 다른 글

[컴퓨터 구조] Register  (0) 2025.03.17
[컴퓨터 구조] Hamming Code  (1) 2025.01.04
[컴퓨터 구조] memory  (0) 2025.01.02