Written

캐시(Cache) 이론 본문

Server/멀티스레드

캐시(Cache) 이론

steeringhead 2023. 7. 18. 00:55
캐시 => CPU와 가까운 메모리

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 static void Main(string[] args)
        {
            //캐시 철학
            //Temporal Locality -> 최근에 변한 녀석이 다시 변할 확률이 높다.
            //Spacial Locality -> 변화가 발생한 녀석의 근처의 친구들(인접 )이 변화가 발생할 확률이 높다.
 
            int[,] arr = new int[1000010000];
 
            {
                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}");
            }
 
        }
cs

 

 

두 개의 블럭은 분명 똑같은 코드인데, 수행하는데 걸린시간이 다르다 ?

 

=>  [ 0 ][ ][ ][ ][ ] 

      [ 1 ][ ][ ][ ][ ]

      [ 2 ][ ][ ][ ][ ]

위 그림을 메모리라고 생각하면, arr [ y,x ] 에서 x값이 먼저 변하는 위쪽 코드블럭은 인접 메모리들의 변화가 많기 때문에 캐시의 덕을 봐서 연산 시간이 더 적게 걸리는것. 반면에 y값이 먼저 변하면 메모리간의 거리가 상대적으로 더 멀리 있는 값들이 변하기 때문에 시간이 더 오래걸린다. 

 

=> 위쪽 블럭의 코드는 캐시Hit 코드. 굳이 멀리있는 메모리까지 갔다오지 않고 가까이에 있는 캐시 메모리에 액세스 하면서 연산의 시간을 단축. 그래서 아래 블럭의 코드보다 더 적은 시간이 걸린 것!

 

=> 캐시 철학

1) 최근 바뀐 메모리가 다시 바뀔 가능성이 높다

2) 최근 변화된 메모리의 인접 메모리가 바뀔 가능성이 높다

라는 철학을 기준점으로 두고 캐시에 데이터들을 저장하는 것. (캐시는 일반적으로 커널모드에서 관리하기 때문에 우리는 지금까지 무의식적으로 캐시의 덕을 보고있었음 !)

 

'Server > 멀티스레드' 카테고리의 다른 글

SpinLock  (0) 2023.07.21
DeadLock  (0) 2023.07.21
메모리 배리어  (0) 2023.07.18
Comments