컴퓨터 공학 전공 공부를 하다보면, '캐시해서 성능을 높인다, 캐싱한다.'와 같은 말을 많이 보게 된다. 한번 등장한 것을 기록하여 다시 접근할 때는 빠르게 접근할 수가 있구나라는 생각이 든다. 하지만 정확한 동작 원리를 까먹어서 이번 기회에 정리해보려고 한다.
캐시 메모리
크고, 싸고, 빠른 메모리를 만드려면 어떻게 하냐
-> memory hierarchy
으로 그런 효과를 내자!
이를 위해 지역성
을 활용한다.
시간 지역성
공간 지역성
캐시에 데이터를 저장할 때 특정 자료구조를 사용해서 묶음으로 저장하는데 이를 캐시 블럭이라고 한다. 저장된 데이터에 대한 정보가 있다! 캐싱된 데이터들이 흩어져있기 때문에 이에 바로 접근하기 위해 존재한다
요청한 데이터가 캐시에 있을 때
요청한 데이터가 캐시에 없을 때
캐시 블럭을 불러왔을 때 하위 몇비트를 활용해 캐시 메모리의 인덱스에 대응시킨다. 만약 캐시 메모리의 블럭의 수가 64개라면, 8비트를 사용하여 메모리 블럭에 인덱싱할 수 있다. 그리고 그 위의 비트들은 tag로 사용한다.
tag가 필요한 이유
캐시 메모리의 캐시 블럭이 8개이고, 캐시 블럭은 5비트라고 가정해보자. 그러면 캐시 메모리에 인덱싱하기 위해서 하위 3비트를 인덱스로 사용하고 상위 2비트를 태그로 사용한다.
만약에 처음에 26이라는 주솟값이 들어왔다. 이를 이진수 주소로 바꾸면 11010이다. 캐시 메모리 인덱스 010에 태그 11과 data 영역에 전체 메모리 주소를 저장한다. 이 다음에 18이라는 주솟값이 들어왔다. 이를 이진수 주소로 바꾸면 10010이다. 인덱스는 010이다. 앞서 26이라는 주소값과 같은 인덱스를 가지게 된다. 만약에 인덱스로만 판별을 했다면, 18이라는 주소가 들어왔음에도 26이라는 주소와 같다고 인식해서 메모리에 26주소에 저장된 값을 요청했을 것이다! -> 이를 막기 위해 tag가 필요하다!!
그래서 캐시는 다음과 같이 작동한다.
1. 들어온 주솟값에서 인덱스를 추출하여 이를 통해 캐시 메모리의 인덱스 부분에 접근한다.
2. Valid bit를 확인한다. (Valid bit -> 올바른 값이 존재하는지)
3. Valid bit가 1이면, 들어온 주소의 태그와 캐시 메모리의 태그가 같은지를 비교한다.
4. Valid bit와 비교결과를 AND 연산하여 1이 나오면 Cache Hit
!!!
Valid bit가 0이면
들어온 주소에 대한 정보를 캐시에 기록하고 Valid bit를 1로 바꾼다.
태그가 불일치하면
교체 정책에 따라 교체되는 블럭이 달라진다.
여러 메모리 주소가 캐시 메모리의 하나의 캐시 블록에 대응되는 방식
간단하고 빠르지만, Conflict Miss가 발생활 확률이 높은 것이 단점이다.
캐시 동작 방식에서 설명한 방식이 Direct Mapped Cache가 동작하는 방식이라고 생각하면 된다.
비어있는 캐시 블록이 있다면, 마음대로 주소를 저장한다.
하지만 저장하고 나서 데이터를 찾을 때 문제가 있다.
특정 블럭끼리 set으로 묶고 한 인덱스가 이 캐시 블럭의 set을 가리키는 방식이다. Direct Mapped Cache와 Fully Associative Cache의 중간 형태다. 캐시 히트인지 아닌지를 판단하기 위해 인덱스에 해당하는 set의 블럭을 모두 확인한다.