캐시(Cache)를 사용하는 것을 캐싱이라고 한다.
그렇다면 캐시는 무엇인가?
캐시의 사전적 어원은 to put something in a hidden or safe store: 라고 되어 있다.
이를 해석해보면 물건을 일시적으로 보관해놓는 안전한 공간이다.
이를 컴퓨터와 연관지어서 생각해보면 자주 필요한 데이터나 값을 일시적으로 저장해두는 공간이라고
해석할 수 있다.
그리고 이 공간을 사용하는것을 캐싱이라고 한다.
그렇다면 이 임시적으로 저장해두는 공간은 왜 생겼을까??
위의 사진을 보면 알수 있듯이 컴퓨터 내에서 RAM 은 하드디스크에서 데이터를 불러오고
CPU는 RAM 에 저장되어 있는 데이터를 이용하여 연산을 수행한다.
그리고 이 사진을 보면 CPU와 RAM 의 성능차이는 시간이 지나면 지날수록 벌어지게 되는 것을 확인할 수 있다.
그 이유는 CPU는 성능에 초점을 더 두었고 RAM 은 저장공간에 더 초점을 두었기 때문이다.
그렇기 때문에 데이터 처리를 하기 위해서는 CPU 와 RAM 은 끊임없이 데이터를 주고 받아야하는데,
RAM 과 CPU의 성능차이가 점점 벌어지자 RAM 이 CPU 의 데이터 처리 속도를 따라가지 못하는 상황이 발생했다.
그래서 자연스레 CPU가 RAM 의 데이터처리를 기다려주어야하는 병목 현상이 발생했다.
이러한 현상을 완화시키기 위해서 CPU에 캐시메모리를 둠으로써 캐시 메모리에 나중에 재사용할 가능성이 높을 것 같은 데이터의 복사본을 저장해두고, CPU 가 요청하는 데이터들을 바로바로 전달할 수 있도록 했다.
캐시 메모리를 메인 메모리로 사용하거나, 캐시 메모리의 용량을 늘려서 사용하면 성능향상이 더 크겠지만
일반 메인 메모리의 트랜지스터 갯수가 1개인 반면에 캐시 메모리의 트랜지스터는 6개나 들어가므로
비용적으로도 훨씬 부담이 크다.
이 캐싱은 CPU 와 RAM 에서만 이루어지는것이 아니라 메인 메모리도 하드디스크를 캐싱한다.
이렇듯 계층적으로 캐싱이 이루어지는데, 빠르고 작은 메모리와 크고 느린 메모리의 장점을 조합해서
크고 빠른 메모리처럼 기능을 하게 하도록 한다.
위에서 재사용성이 클 것같은 데이터를 캐시에 저장한다고 했는데, 재사용성이 클 것 같은 데이터는 어떻게 판단하는 걸까 ?
캐싱은
을 바탕으로 동작한다.
시간 지역성의 원리는 한 번 참조된 데이터는 잠시 후에 재사용 될 가능성이 높다고 판단하는 것이다.
메모리 상에서 같은 주소에 여러번 동작을 할 경우, 상대적으로 작은 크기의 캐시를 사용해도 똑같이 동작 할 수 있으므로 효율성을 높일 수 있다. (ex) for문이나 while 문 안에서 사용되는 i 변수
공간 지역성의 원리는 특정 데이터에 접근할때, 그 특정 데이터 뿐만 아니라 그 특정 데이터 근처에 있는 다른 데이터들도 캐시로 가져오는 것이다.
데이터들을 오름차순이나 내림차순으로 접근한다면, 이미 캐시에 저장된 같은 데이터들을 접근하게 되므로 캐싱의 효율성을 높일 수 있다. (ex) 배열 안의 데이터들은 순서대로 접근할 가능성이 높다.
CPU가 메인 메모리에 데이터를 요청할때 메인 메모리에 접근하기 전에 캐시메모리에 접근해서 데이터를 요청하는데,
캐시 메모리에 해당 데이터가 있다면 캐시 히트, 해당 데이터가 없어서 메인 메모리에서 가져와야한다면 캐시 미스라고 한다.
만약에 CPU 에서 데이터를 단순히 읽는 동작이 아니라 입력하거나 값을 수정해야하는 동작이 발생하고,
그 값들이 캐싱된 상태라면, 그 값을 변경했을때 메인 메모리의 값이 변경/수정 되는것이 아닌 캐시 메모리 내에 있는 값이 변경/수정된다.
그렇기 때문에 메인 메모리를 업데이트를 해주어야 하는데 이 메인 메모리를 업데이트 하는 시점에 따라서 2가지의 방식으로 나뉜다.
Write Through 정책은 메인 메모리를 바로 업데이트하는 방식이다.
캐시와 메인 메모리의 일관성을 유지할 수 있지만 , 값이 바뀔때마다 매번 변경해줘야 하므로 속도가 느리다는 단점이 있다.
Wrtie Back 방식은 캐시만 업데이트를 하다가, 업데이트 된 데이터가 캐시에서 없어질때 그때 메인 메모리를 업데이트 해주는 방식이다.
속도는 빠르지만 캐시와 메인 메모리의 값이 다를 때가 있는데 이 일관성을 유지하는데 유의해야한다.