컴퓨터의 구조는 대략적으로 이러하다
[[ CPU ]]
[ 레지스터 ]
[ L1 캐시 ]
[ L2 캐시 ]
|
|
[[ RAM ]]
- 그럼 무엇을 캐시에 우선적으로 넣어둘 것인가?
- Temporal Locality : 방금 호출된 메모리
- Spacial Locality : 방금 호출된 메모리 근처의 메모리
- 위 두가지 캐싱 방법으로 인해 문제가 발생한다.
- 만약 캐시에 올린 데이터가 멀티스레드 환경으로 인해 RAM의 데이터를 누군가 읽기 혹은 쓰기를 한다면??
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($"(y, x) 순서 걸린 시간 {end - now}");
}
{
long now = DateTime.Now.Ticks;
for(int y = 0; y < 10000; y++)
for(int x = 0; x < 10000; x++)
arr[x, y] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"(x, y) 순서 걸린 시간 {end - now}");
}
/*
이론적으론 둘이 똑같은 시간이 나와야 하지만
(x, y)가 2배 이상오래 걸린다.
캐싱의 접근 방법때문이다.
*/