# 3 라인에 있는 덧셈 연산이 실행되려면 메인 메모리에 저장된 ret 변수와 리스트 arr의 한 요소 값을 가진 elem 변수가 필요합니다. 메모리에서 바로 CPU의 연산 장치로 ret와 elem 값을 가져올 수 없으므로 반드시 CPU에 있는 메모리 공간인 레지스터로 값을 가져와야 합니다. 레지스터로 가져온 두 값은 이제야 더해집니다. 이 결괏값은 어디에 저장될까요? 바로 메모리에 저장되면 좋겠지만 이 결괏값은 다시 임시 레지스터에 저장됩니다. 임시 레지스터에 저장된 후에야 다시 메모리에 있는 ret 변수에 저장됩니다. 조금 복잡해 보이지만 핵심은 간단합니다. 메인 메모리에 있는 변수는 연산을 하기 전과 후에 반드시 레지스터를 거친다는 점이지요.
그렇다면 이렇게 추측해 볼 수 있습니다. # 3 라인의 코드가 실행되면 1) CPU는 매번 메인 메모리에 저장된 ret 값을 레지스터로 가져오고, 2) arr에서 한 요소를 매번 레지스터로 옮긴 후 3) 두 값을 더해 다시 레지스터에 저장하고 4) 그 값을 메인 메모리의 ret에 저장한다고 말이지요. 하지만 이렇게 연산이 진행된다면 문제가 하나 생깁니다. 정작 덧셈 연산은 1클럭 만에 계산되는데, 이를 위해 ret 값을 가져오는 데 최소 20클럭, 배열의 한 요소를 가져오는 데 또 20클럭, 다시 결괏값을 레지스터에서 메인 메모리의 ret로 옮기는 데 20클럭이 소요되어 최소한 60클럭 이상이 소요됩니다. 게다가 이와 같은 작업을 배열의 모든 요소에서 수행해야 합니다. 매우 비효율적이지요.
하드웨어 설계자들은 지역성의 원리를 토대로 이와 같은 비효율성이 엄청나게 많이 일어난다는 것을 알게 되었습니다. 이에 한 가지 발상을 합니다. CPU와 메인 메모리 사이에 성능이 빠른 버퍼로 메모리를 둔다면 이런 비효율성을 줄일 수 있지 않을까 하는 아이디어였습니다. 이에 도입된 것이 캐시입니다. 캐시가 어디에 있는지, 어떻게 작동하는지 간단하게 알아보도록 하죠.