티스토리 뷰

Study/Architecture

[Study] Memory Hierarchy (3) - Cache Write Policy

생각많은 소심남 2013. 3. 22. 19:46

이전 포스트에서 Cache와 Memory사이의 Data를 검증하는 과정을 다뤘다. 마지막 부분에서 과연 Cache miss가 났을때는 해당 instruction을 다시 수행하면서 다시 fetch하는 과정이 들어가는데 이때 Cache의 write이 이뤄지게 된다. 그럼 어떤 규칙에 의해서 cache에 써지는 지 잠깐 언급해보고자 한다.


 일단 Cache 본연의 목적을 살펴보면 Memory Access하면서 얻을 Data의 일부를 옮겨놓음으로써 쉽고 빠르게 Access 하기 위함이다. 당연히 Memory와 Cache간의 Consistency가 중요한 요소이며 이걸 고려하면 당연히 miss가 안나는 방향으로 설계가 되어야 할 것이다. 


<Write Back / Write Through>

 가장 간단한 방법은 Cache에 write이 일어날때 같은 Data를 Memory에도 write를 하는 것이다. 그러면 miss가 나타날 수 있는 가능성을 줄일 수 있을 것이다. 그러는 과정에서 miss가 일어난다면 아마 Write된 이후에 그 정보가 cache에서 날아가버린 상태일 것이고, 쓰는 상태에서는 최대한 consistency를 보장하게끔 하는 방식이고 이것을 보통 Write-Through Cache라고 한다. 

 하지만 잘보면 Cache에서 Miss가 일어나는 것을 막기 위해서 Memory에 보완적인 방법으로 덧쓰는 것자체는 어쩌면 낭비로 작용할 수 있다. 물론 어떤 알고리즘을 적용할 필요없이 단순히 Cache에 쓰면 Memory에 쓰면 편하긴 하겠지만 Memory에 Data를 쓰는 과정 자체가 시스템 Resource를 잡아 먹는다. 그래서 느리고 앞에서 말했던 것처럼 System Resource를 잡아먹고 memory Traffic을 증가시킨다. 그래서 임시로 Cache쪽에 Write Buffer라는 것을 두고 Memory에 Data가 써지는 동안 갖고 있게끔 한다. 그럼에도 전체적인 성능 저하는 막을 수 없다. 

 이와는 다르게 아예 Cache에서만 Data를 쓰게 하고 Memory에는 특이 사항이 있을 때에만 알려주는 방식이 있는데 이를 Write-Back(Copy Back) Cache 라고 한다. 말그대로 Memory에 쓰는 과정을 최대한 줄이는 방식이다. 당연히 Memory Write 되는 과정이 줄어들기 때문에 performance의 향상을 가져오고, 빠르다. 문제는 복잡하고 Write Through 방식이 1 cycle내로 처리할 수 있는 작업을 두 cycle로 나눠서 처리하게 된다. 이말이 뭔가 하니 Write Through에선 무조건 Cache와 Memory에 쓰는 단순한 방식이었지만, Write Back을 하면서 overwrite을 해도 되는지 check하는 과정이 1cycle로 소비된다.  결국 실제 동작하는 작업까지 포함해서 2cycle이 소비되는 것이다. 그리고 write Through의 특징으로 나왔던 consistency도 필요할 때만 수행하게 됨으로써 miss가 날 가능성이 조금 더 높을 수 있다는 것이다. 아무튼 이런식으로 발생하는 miss penalty를 해소하기 위해서 Write-Back에서도 Write Buffer를 달기도 한다.

 이 밖에도 CPU의 state에 따라서 Cache write의 방향이 결정되는 방식인 Write Bypass 방법도 있는데 이부분은 책에도 나오지 않은 부분이라 생략..

위에서 제시한 건 Write를 어디에다 하냐는 관점이고 어떻게 하냐는 관점은 또 두개로 나눌 수 있다. 첫번째는 Write을 했을 때 해당 데이터들을 바로 Cache상에 overwrite하는 Write-Allocate 방식이고, 다른 하나는 그냥 바로 Memory로 전달되는 Write-no-Allocate 방식이다. 그러면 위에서 설명한 WriteThrough/Back과 Write Allocate/no-Allocate의 관계를 살펴볼 수 있다. 우선 Write Through  자체는 Memory로 써지는 과정이므로 중간에 따로 Cache에 할당될 필요가 없다. 그래서 채택하는 방식이 Write no Allocate 방식이고, WriteBack은 반대로 Memory를 거치는 과정이 드물기 때문에 Cache 상에서 따로 관리해주는 Write Allocate 방법을 쓴다. 


아무튼 Cache를 사용하는데 있어서도 Cache 와 Memory간의 Consistency를 고려해줘야 하며, 이를 유지하기 위해서 채택하는 방법이 각각 다르다는 것을 알 수 있다.

댓글