캐쉬 장치의 동작 원리를 간단하게 살펴보자.
만약에 데이터가 업데이트 될 때 마다 메모리에 기록해야 한다면 처리속도가 매우 느릴 것이다.
따라서 컴퓨터는 CPU 코어에 캐쉬장치를 마련하여 정보를 어느정도 저장했다가 메모리에 기록하는 방식을 사용한다.
캐쉬에는 두 가지 철학이 있다. 이해하기 쉽게 레스토랑의 직원(쓰레드)의 관점에서 비유하자면,
1) Temporal Locality (시간적)
방금 주문한 테이블에서 추가 주문이 나올 확률이 높다. 방금 주문한 걸 메모해 놓자
2) Spacial Locality (공간적)
방금 주문한 사람 근처에 있는 사람이 추가 주문을 할 확률이 높다. 방금 주문한 사람과 합석하고 있는 사람들의 주문목록도 메모해두자.
이 중에서 Spacial Locality를 확인할 수 있는 코드를 살펴 보자.
class Program
{
// [][][][][] [][][][][] [][][][][] [][][][][] [][][][][]
static void Main(string[] args)
{
int[,] arr = new int[10000, 10000];
long now = DateTime.Now.Ticks;
for (int y = 0; y < 10000; y++)
{
for (int x = 0; x < 10000; x++)
{
arr[y, x] = 1;
}
}
long end = DateTime.Now.Ticks;
Console.WriteLine(end-now);
now = DateTime.Now.Ticks;
for (int y = 0; y < 10000; y++)
{
for (int x = 0; x < 10000; x++)
{
arr[x, y] = 1;
}
}
end = DateTime.Now.Ticks;
Console.WriteLine(end - now);
}
}
두 for문의 차이점을 확인했는가?
하나는, 2차원 배열에 순서대로(차례대로) 접근하는 방식이고
다른 하나는, 2차원 배열에 순서대로 접근하지 않고 건너 뛰면서 접근하는 방식이다.
메모리에 기록하는 시간을 출력하여 확인해 보았더니 차례대로 접근하는 방식이 더 빨리 메모리에 되었다.
이런 결과가 나오는 이유는 CPU가 접근한 데이터와 가까이 있는 데이터들을 캐쉬에 먼저 기록해 놓기 때문이다.
따라서 가까운 주소의 데이터에 접근할 때 캐쉬에 기록해 놓은 정보들을 한 꺼번에 메모리에 업데이트하여 빠른 속도로 작업을 할 수 있게 된다.