C# Rookiss Part4 게임서버 : 캐시이론
🙇♀️캐시이론
식당에서 직원이 주문을 받자마자 주문 현황판에 기입하는 것보다 최대한 주문을 많이 받고 주문 현황판에 기입하는 것이 효율적이다. 직원이 주문 현황판에 적지 않은 기억이 바로 캐시이다
- 캐시의 문제점
- A직원이 2번 테이블에서 콜라를 주문을 받았다
- 2번 테이블에서 B에게 콜라를 취소하고 사이다로 교체를 요구했다
- B는 콜라의 주문을 받지 않았기에 혼선이 발생한다
쓰레드마다 각각의 코어로 실행되고 있고 코어마다 자신만의 캐시가 따로 있으므로 발생하는 문제!!
🪐cpu와 코어
- cpu에서는 여러 코어가 있다
- 코어에는 ALU와 캐시 장치가 있다
- ALU
- 연산기능을 하는 장치
- 캐시장치
- 레지스터, L1 캐시, L2 캐시가 있다
- 레지스터는 단기기억
- L1 캐시는 미니 수첩
- L2 캐시는 대형 수첩
- ALU
- 코어에서 RAM(메인 메모리)로 캐시에 담긴 정보를 보낸다
- RAM은 주문 현황판
🪐Temporal Locality, Spacial Locality
- Temporal Locality
- 시간적으로 보면, 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다.
- 방금 주문한걸 메모해 놓으면 편하지 않을까?
- Spacial Locality
- 공간적으로 보면, 방금 주문한 사람 근처에서 있는 사람이 추가 주문을 할 확률이 높다.
- 방금 주문한 사람과 합석하고 있는 사람들의 주문 목록도 메모해 놓으면 편하지 않을까?
int[,] arr = new int[10000, 10000];
{
// 5 * 5 배열
// [1][2][3][4][5] [][][][][] [][][][][] [][][][][] [][][][][]
// 공간적으로 캐시힛 상황
// 캐시의 이점을 살려 캐시 메모리에 바로 넣어짐
// 빠르다
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}");
}
{
// 5 * 5 배열
// [1][][][][] [2][][][][] [3][][][][] [4][][][][] [5][][][][]
// 캐시의 이점을 살리지 못함
// 데이터를 채울때마다 램으로 가야됨
// 느리다
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($"(y, x) 순서 걸린 시간{end - now}");
}