안녕하세요 준준입니다.
오늘은 캐시에 대해서 알아보고
코드를 이용해서 실제 캐시가 어떻게 작동하는지 알아가는 시간을 가지도록 하겠습니다.
- 캐시란 무엇일까?
캐쉬는 저장된 데이터를 더욱 빠르게 접근하기 위해 cpu 안에 존재하는 메모리입니다.
CPU가 메인 메모리를 읽거나 쓰고자 할 때, 먼저 그 주소에 해당하는 데이터가 캐시에 존재하는지 살피고 데이터가 존재한다면 직접 캐시를 읽고 존재하지 않는다면 메인 메모리에 접근합니다.
이 경우 CPU는 메인 메모리에 직접 접근해서 전송된 데이터를 캐시에 복사해 넣음으로써 다음에 CPU가 더 빠르게 데이터를 찾을 수 있게 도와줍니다.
캐시는 임시 저장소라고 생각하시면 됩니다.
- 캐시가 필요한 이유
cpu는 매우 빠른 속도로 연산이 되는데 연산 속도보다 데이터를 가지고 오는 속도가 매우 느립니다.
따라서 이를 해결해기 위해 컴퓨터 설계자들은 캐시라는 것을 도입을 하였습니다.
- 캐시의 철학
그럼 캐시는 어떠한 원칙에 따라서 메인 메모리에서 데이터를 가지고 올까요?
1) TEMPORAL LOCALITY
-시간적으로 보면, 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다.
-방금 주문한 걸 메모해 놓으면 편하지 않을까?
2) SPATIAL LOCALITY
-공간적으로 보면, 방금 주문한 사람 근처에 있는 사람이 추가 주문을 할 확률이 높다.
-방금 주문한 사람과 합석하고 있는 사람들의 주문 목록도 메모해 놓으면 편하지 않을까?
- 예시코드
아래에 코드는 캐시의 예시를 들어주는 코드입니다.
코드만 보시고 어떤 코드인지 이해해 보시고 코드 밑에 설명을 보시면 더욱 좋을 것 같습니다.
memset(buffer, 0, sizeof(buffer));
{
uint64 start = GetTickCount64();
int64 sum = 0;
for (int32 i = 0; i < 10000; i++)
for (int32 j = 0; j < 10000; j++)
sum += buffer[i][j];
uint64 end = GetTickCount64();
cout << "Elapsed Tick" << (end - start) << endl;
}
//첫번째
{
uint64 start = GetTickCount64();
int64 sum = 0;
for (int32 i = 0; i < 10000; i++)
for (int32 j = 0; j < 10000; j++)
sum += buffer[j][i];
uint64 end = GetTickCount64();
cout << "Elapsed Tick" << (end - start) << endl;
}
2차원 배열에 FOR문 2개를 이용하여 배열에 접근하여 배열을 탐색하는 시간을 출력합니다. 첫번째 괄호와 두번째 괄호의 차이점은 첫번 째 괄호는 BUFFER[I][J] 두번째 괄호는 BUFFER[J][I] 어떤 차이인지 보이시나요? J와 I 순서가 다릅니다. 그럼 아래와 같은 배열이 있다고 하면 [][][][][][][][][][][][][][][][][][][][][][][][][] [][][][][][][][][][][][][][][][][][][][][][][][][] [][][][][][][][][][][][][][][][][][][][][][][][][] [][][][][][][][][][][][][][][][][][][][][][][][][] [][][][][][][][][][][][][][][][][][][][][][][][][] 첫번째 괄호는 한줄에 다 접근하면 다음에 접근하고 두번째 괄호는 첫번째줄 1번 두번째줄 1번 이렇게 접근합니다. 아까 캐시는 메인 메모리에서 데이터를 가지고 올때 공간적 시간적 원칙에 따라 주번 데이터에 접근할경우 시간을 단축 시킬 수 있습니다. |
반응형