캐시의 등장 배경
CPU의 처리속도는 급격히 증가했지만 메모리의 접근하는 속도는 CPU처리속도에 비해 늘어나지 못하였다
메모리보다 빠르고 CPU보다 느린 캐시를 메모리와 CPU 사이에 위치하여 데이터 접근 시간을 줄인다.
데이터를 갱신할때 바로 메모리에 갱신하는게아니라 캐시메모리에 기입을 한뒤 메모리에 올라간다.
캐시 철학
- Temporal Locality
- (시간 지역성)최근에 접근한 데이터에 또 접근할 가능성이 높다.
- Spacial Locality
- (공간 지역성)한번 접근한 데이터로부터 주변에 데이터를 또 접근할 가능성이 높다.
멀티 쓰레드 환경에서는 서로 갖고있는 데이터가 달라 문제가된다. 쓰레드 마다 각각 코어로 실행되고있고
자신만에 캐시를 갖고있는대 다른 쓰레드에서 데이터를 건들이면 최근 데이터를 갖고오는게 아닌 자신이 기억하고있는 캐시의 데이터를 갖고와서 문제가 생긴다.
캐시 장점
캐시에 데이터를 미리 복사해 놓으면, 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근 할 수 있다.
캐시 동작 방식
- 데이터 요청이 들어오면, 먼저 캐시에서 데이터 탐색을 진행
- 캐시가 없거나 오래된 경우 원본 데이터가 저장된 곳에서 데이터를 조회후 캐시에도 데이터를 복사 및 갱신
- 캐시에 데이터가 있으면 캐시의 저장된 데이터를 제공
- 오래된 데이터는 삭제한다.
캐시 공간 지역성 테스트(2차원 배열)
namespace ServerCore
{
internal class Program
{
static void Main(string[] args)
{
int[,] arr = new int[10000, 10000];
{
long now = DateTime.Now.Ticks;
for (int y = 0; y < arr.GetLength(0); y++)
{
for (int x = 0; x < arr.GetLength(1); x++)
{
arr[y, x] = 1;
}
}
long end = DateTime.Now.Ticks;
Console.WriteLine($"(x,y) 순서 걸린 시간{end-now}");
}
{
long now = DateTime.Now.Ticks;
for (int y = 0; y < arr.GetLength(0); y++)
{
for (int x = 0; x < arr.GetLength(1); x++)
{
arr[x, y] = 1;
}
}
long end = DateTime.Now.Ticks;
Console.WriteLine($"(x,y) 순서 걸린 시간{end - now}");
}
}
}
}
결과
(x,y) 순서 걸린 시간 7518814
(x,y) 순서 걸린 시간 11132542
왜이렇게 차이가 날까? 간단하게 그림으로 설명 하자면
아래 for문의 접근방식은 접근한 메모리로부터 조금 떨어진 위치에 접근하고있어 캐시효율이 조금 떨어진다

'프로그래밍 > MultiThread Programing' 카테고리의 다른 글
| 4. Lock과 Deadlock (0) | 2024.07.11 |
|---|---|
| 3. 메모리 베리어 (0) | 2024.07.11 |
| 1. 멀티쓰레드 개론 (0) | 2024.07.10 |

