티스토리 뷰

지난 포스트를 통해서 Cache를 사용하면 어떤 이점을 가져올 수 있을지에 대해서 다뤄봤다. 그러면 이런 궁금증을 가져볼 수 있다. Cache 자체가 Data Access 측면에서 Memory에 비해 이점이 있다면 왜 Cache를 쓰지 Memory도 같이 쓰는 건지 말이다. 사실 얼마든지 생각해볼 수 있는 주제일 수 있지만 문제는 바로 cost의 관점이다. Architecture를 설계하는 데 있어서 고려해야 될 가장 중요한 요소는 바로 얼마나 싸게 만들 수 있냐는 것이다. 즉 가격대 성능비를 고려해서 설계하는 것이다. 물론 Cache를 많이 넣으면 그만큼 빨라지겠지만 Cache를 구성하는 SRAM의 가격이 비싸고, 공간도 적다. 거기에 비해서 지금과 같은 DRAM Memory가 lower level에 있고, Cache가 Upper Level에 있는 경우에는 공간적 이점을 살리면서 성능도 가격에 비해서 나쁘지 않기 때문에 채택한 것이다. 결국은 돈 때문에..

 자 그럼 이제 Memory와 Cache간의 상관관계를 알아봐야 한다. 가장 이상적인 목표는 CPU가 Cache에서 데이터를 읽어오되 최대한 Memory에서부터 읽는 것과 동일한 효과를 낼 수 있느냐는 것이고, 이걸 Cache의 Transparency라고 한다. 그렇게 따져보면 CPU가 Cache의 특정 영역의 search할 경우엔 이 작업이 동시에 Memory의 일정 영역을 search하는 것과 동일해야 할 것이고, 즉 Cache와 Memory간에 어떤 규칙에 의해서 mapping이 되어 있을거란 추측을 해볼 수 있다. 가장 간단한 방법은 직접적으로 mapping이 되어 있는 경우이다.

위와 같이 Cache와 Memory간에 mapping이 되어 있는 것을 direct mapped Cache 구조라고 한다. 당연하겠지만 Cache에 비해서 Memory는 엄청 클 것이고, 만약 cache를 통해서 Memory의 특정영역에 Access 하고 싶으면 위와 같이 cache의 한 영역이 여러개의 Memory로 공유된 형태를 띌 것이다. 예를 들어 block size가 4byte이고 physical Memory의 크기가 4 GB라고 가정한다면, 그 Physical Memory는 1G(2^30)개의 block으로 구성될 것이다. 아래 이미지 같이 말이다. 

여기서 Cache block의 갯수를 알면 한개의 Cache가 몇개의 Memory block과 공유하는 지를 알 수 있다. 예를 들어 cache block의 갯수가 1k(2^10)개라면 총 2^20개의 Memory Block들이 한개의 Cache Block으로 공유하고 있다는 것을 확인할 수 있다. 이제 여기서 자기가 원하는 데이터를 어떻게 찾을 수 있을까?

direct mapped 방식에서는 block을 지칭하는 끝의 자리수를 확인하면 탐색하는 영역을 줄일 수 있다. 가령 위의 예같이 Cache에서 101이란 영역에서 Search를 시작하면 실제로 Memory에서는 끝자리가 101인 00101, 01101, 10101, 11101을 검색하는 결과를 얻을 것이고 원하는 답은 그 것중 한개에 있을 것이다. 예를 들어보면 다음과 같다.

 


위와 같이 Memory로부터 하나를 읽어오면 이안에 Cache에서 찾을 block index값이 포함되어 있다. 그래서 Cache에서 찾은 정보의 tag와 Memory 상의 tag가 일치한 경우에 우리가 hit이라고 말할 수 있다. 그러면 이때 Cache의 Data를 가져와도 이 정보를 Memory에서 가져온 것과 같다고 할 수 있는 것이다. 다만 기타 변수(어쩌다가 Tag가 같아지는 현상)를 고려하고 따로 valid bit을 정의해놓는다. 그래서 결론적으로 Cache와 Memory가 hit이 됬다고 하는 것은 Cache의 Tag와 Memory의 Tag가 일치하면서 valid bit이 1인 상태를 말하는 것이다. 이 경우는 앞에서 언급했던 Temporal Locality 를 활용했다고 볼 수 있다. 

 이렇게 hit이 됬으면 당연히 정상적인 절차이므로 CPU는 그대로 Cache Data를 별 의심없이 사용할 것이다. 하지만 miss가 났을 경우에는 이를 수정하는 과정을 거쳐야 한다. 이전 포스트에서 잠깐 설명했던 것처럼 Cache miss가 났을 경우에는 해당 instruction을 수행하고 있는 CPU에 Stall을 건 후 다시 instruction을 읽어서 Cache에 쓰는 과정을 거치게 된다. 이때도 어떤 부분에 miss가 났느냐에 따라서 Instruction Cache miss냐 Data Cache Miss냐로 구분 지을 수 있다. 


댓글