강좌 & 팁
많이들 헛갈리는 것이라서 이번 기회에 cache 관련된 용어를 정리해 볼까 합니다.
write throuth vs write back
cache flush vs cache clean vs cache invalidate vs cache drain
cache valid vs cache dirty
cache 는 CPU 와 memory 사이에 존재합니다.
CPU 입장에서 memory 에서 데이타를 자져오는 것보다 cache 에서 가져오는 것이 빠르기 때문에
cache 를 이용하면 성능이 향상되겠죠.
하지만 이 cache 는 CPU 입장에서는 메모리를 access 하는 것처럼 보이지 않게 동작합니다.
그럼 무엇이 문제가 될까요?
먼저 write throuth vs write back 를 확실히 알아야 합니다.
write through 는 CPU <---> cache = memory
write back 은 CPU <--> cache <--> memory
write through 는 memory 의 내용과 cache 의 내용이 항상 일치하게 됩니다.
write back 는 cache 까지만 써지고 memory 에는 나중에 씌여집니다.
우리가 일반적으로 cache 를 이용해 성능을 높인다고 할때는 write back 을 사용할때죠.
이제 write back 을 이용해서 CPU -> cache 를 쓸때 어떻게 되는지 봅시다.
먼저 cache 를 사용하려면 cache 를 활성화 시켜야 겠죠? 이때 valid 가 되어 있어야 합니다.
그리고 나서 CPU 에서 data 를 쓰면 cache 에만 내용이 쓰입니다.
당연히 cache 와 실제 memory 와는 다른 내용이 있게 됩니다.
이 상태를 dirty 하게 되었다고 합니다. 쉽죠?
cache 의 상태를 나타내는 두개가지가 바로 valid 와 dirty 입니다.
이제 마지막으로 cache flush vs cache clean vs cache invalidate 입니다.
cache flush : cache 를 무력화 시킵니다.
cache 와 memory 간에 다른 내용이 들어 있더라도 cache flush를 하면
cache 의 내용은 무시해 버리게 됩니다.
cache clean : cache 와 memory 간에 다른 내용이 들어 있는 상태인 dirty 를 동기화 시켜버리고
해당 cache 를 비워 버립니다.
cache drain : write buffer 에서 memory 로 쓰는 것을 말합니다.
cache invalidate : dirty 를 무력화 시키는 것을 말합니다.
arm 에서는 아키텍쳐 별로 두개이상의 동작이 동시에 처리되도록 되어 있기도 하고
별도의 명령어로 처리되기도 합니다.
flush 의 개념은 cache 를 무력화시키는 겁니다.
즉 이후의 접근에서는 메모리를 직접 접근하겠죠 따라서 일부에서는 invalidate 와 flush 는
동일한 명령어로 처리되기도 합니다.
또다른 코어에서는 별도의 명령으로 처리되기도 합니다.
할때마다 헛갈려서 정리해 봅니다.