폰 노이만 아키텍처 구조상 컴퓨터를 크게 나눠보면 CPU
, 메인 메모리
, IO장치
로 나누어진다. 이때 CPU는 CPU 내 레지스터에서 데이터를 가져올때 1틱 사이클이 발생한다. CPU 레지스터에 데이터가 없다면 데이터를 메인 메모리에서 가와야만 한다. 문제는 메인 메모리에서 데이터를 가져올때는 수많은 틱 사이클이 걸리게 된다.
이러한 문제를 해결하기 위해 CPU와 메인 메모리 사이에 더 빠른 메모리를 추가하는 것이다. 이것을 우리는 캐시라고 한다. 추가한 캐시에는 CPU와 메인 메모리 사이에 필요한 데이터를 불러온 후 저장해두는것이다. 그러면 아래와 같은 동작을 할 수 있다. CPU에서 데이터를 가져오는데 레지스터 접근은 1틱, 캐시 접근은 3틱, 메인메모리 접근은 10틱이 걸린다 하자. (읽고 쓸때 발생하는 연산 시간은 고려하지 말고 확인하고 가져 오는 시간을 합친것이라 생각하자)
CPU가 레지스터에 해당하는 데이터를 확인
1.1. 있다면 레지스터의 데이터를 이용
1.2. 없다면 다음으로.
캐시에서 해당하는 데이터가 존재하는지 확인
2.1. 있다면 캐시의 데이터를 이용
2.2. 없다면 다음으로.
메인메모리에 해당하는 데이터가 존재하는지 확인
3.1. 메인 메모리의 데이터를 이용
우리는 위 과정에서 캐시가 없다면 데이터가 없을때마다 11틱씩 (레지스터 확인 + 메인 메모리 확인) 소요하게 된다. 만약 캐시를 둔다면 한번이라도 캐시에 접근하게 되면 4틱(레지스터 확인 + 캐시 확인)만 소요할 수 있다. (물론 캐시에서 맨처음 값을 저장할땐 메인 메모리에 접근해야함으로 14틱이 소요되겠지만 (레지스터 확인 + 캐시 확인 + 메인 메모리 확인) 한번 올라간 데이터가 재 사용될때는 4틱만 소요된다.)
만약 우리가 요청하는 데이터가 계속 캐시에 없으면 어떡할까? 라는 의문을 가질 수 있다. 물론 말 그대로 계속 캐시에 저장된 값을 요청하지 않는다면 CPU-> 레지스터 -> 캐시 -> 메인메모리 접근 까지 총 14틱이나 발생하면서 모든 메모리들을 찾아본 후 들고와야한다. 근데 말처럼 계속 캐시 되지 않은 데이터만 요청할 수 있을까?
이 문제는 데이터 지역성의 개념을 알아야한다. 우리가 사용하는 데이터는 공간 지역성과 시간 지역성을 가진다. 공간 지역성
이란 내가 필요할 데이터가 연속해서 사용될 것이라는거다. 시간 지역성
이란 내가 방금 사용한 데이터는 가까운 미래에 다시 사용될 것이라는거다. 이러한 지역성 개념으로 방금 문제는 크게 걱정할 필요가 없다. 이후 내용은 캐시를 공부해보도록 하자.
결론적으로 우리는 운영체제 도움 없이 하드웨어만으로 메모리 접근 속도를 향상 시킬 수 있다. 현재 우리들의 컴퓨터는 간단하게 아래와 같은 메모리 계층 구조들을 가지게 되었다.