이번 포스트에서는 캐시의 기본 개념에 대해 소개하고 ARM 프로세서에 적용된 캐시의 개념에 대해 설명하겠습니다.
 
CPU 캐시(Cache)란
 
캐시란 컴퓨터 용어로 캐시는 데이터나 값을 미리 복사해 놓는 임시 장소를 의미합니다. 캐시는 자주 사용되는 데이터를 임시 저장해 데이터에 접근하는 속도를 최적화하기 위해 사용됩니다. 다양한 소프트웨어 분야에서 캐시가 사용되는데 CPU를 설계할 때도 캐시를 사용해 CPU의 실행 속도를 최적화합니다. 그렇다면 CPU에서 캐시는 어떤 방식으로 사용이 될까요? 캐시는 어떤 형태일까요? 의문이 계속 생깁니다.
 
먼저 CPU에서 사용되는 캐시에 대해 알아봅시다. 사실 처음 CPU를 연구했던 과학자들은 처음부터 캐시를 CPU에 적용한 것은 아니었습니다. 오랫동안 CPU를 설계하는 개발자들은 CPU를 디자인하면서 다음과 같은 사실을 알게 됐습니다.
 
    ● CPU 메모리로부터 데이터를 읽어 오는데 많은 시간을 소비한다.
 
일반적으로 메모리는 CPU보다 100배 정도 느리다고 알려졌는데, CPU입장에서 100 사이클 동안 다른 동작을 하지 않고 기다려야 메모리에서 데이터를 읽어올 수 있게 됩니다. 차를 몰다가 신호등을 만나면 기다려야 하듯이 메모리에 있는 데이터를 읽는 동작이 CPU 입장에서는 일종의 병목 현상이 됐습니다. 
 
만약 메모리의 특정 영역에 있는 데이터를 엑세스할 경우 CPU 근처의 임시 저장 공간에 미리 읽어오면 메모리로부터 데이터를 읽어 오는 시간을 줄일 수 있다는 사실을 발견하게 됐습니다. 여기서 말하는 CPU 근처의 임시 저장 공간을 캐시라고 말하며 CPU의 성능을 키우기 위한 핵심 기능으로 사용되고 있습니다.
 
CPU 캐시는 메모리에 데이터를 읽어 오는 시간을 줄이기 위해 사용되는 메모리이며, 주 메모리에 비해 크기는 작지만 속도는 매우 빠릅니다. 그렇다면 캐시는 어떻게 사용될까요? 캐시가 사용되는 기본 원칙을 캐시 정책이라고 하며 이를 캐시 읽기 정책과 쓰기 정책으로 분류할 수 있습니다.
캐시(Cache)의 정책
 
캐시의 정책으로 크게 “캐시 읽기”와 “캐시 쓰기” 정책으로 분류될 수 있습니다.
 
캐시 읽기 정책
 
프로세서가 어셈블리 명령어가 실행될 때 메모리에 존재하는 데이터를 읽는 동작을 자주 수행합니다. 데이터를 읽을 때 먼저 캐시에 접근합니다. 요청한 데이터가 캐시에 있으면 캐시에 있는 데이터를 즉시 가져와 사용합니다. 이런 동작을 캐시 히트라고 부릅니다. 반대로 캐시에 요청한 데이터가 존재하지 않으면 이를 캐시 미스라고 하며, 요청한 데이터는 메모리에서 읽어서 캐시로 가져와야 합니다. 조금 어려운 이야기지만 한 개 데이터를 읽어 오지 않고 캐시 라인을 읽어와야 합니다.
 
캐시 읽기 정책을 반영하면 다음과 같은 문제에 직면하게 됩니다.
 
   ● 캐시 미스가 발생했는데 만약 캐시가 가득 차 있는 경우 어떻게 이를 처리해야 할까?
 
위와 같은 요구 사항은 다양한 방식으로 구현할 수 있으나 대표적으로 LRU(Least Recently Used) 방식을 적용할 수 있습니다. 최근에 액세스한 캐시는 남아 있고 대신 오래된 엔트리를 삭제하는 방식입니다. 
 
캐시 쓰기 정책
 
이번에는 캐시 쓰기 정책에 대해 알아 봅시다. 
프로세서가 메모리에 어떤 데이터를 쓰려고 할 때 "캐시 쓰기 정책"이란 기준에 따라 데이터를 캐시에 먼저 저장합니다. 프로세서가 캐시에 데이터를 쓰면 연산 속도를 높힐 수 있는데 빠른 시간 내에 캐시에 써진 데이터를 메모리에 업데이트해야 합니다. 이 때 어떤 방식으로 기준으로 캐시에 써진 데이터를 메모리에 업데이트해야 하는지 결정해야 하는데, 이는 라이트 쓰루(Write Through)와 라이트 백(Write-back)으로 방식으로 분류될 수 있습니다.
 
라이트 쓰루 정책에 따라 데이터를 쓰면, 데이터가 캐시에 써지면 동시에 메모리에도 업데이트됩니다. 만약 캐시에 데이터를 쓰고 난 다음 캐시에서 같은 데이터를 읽을 때는 캐시에서 읽어 오게 됩니다.
 
라이트 백 정책은 라이트 쓰루 정책과는 달리 캐시에 존재하는 "라이트"라는 버퍼에 먼저 데이터를 쓴 다음에 더티(Dirty)라고 체크합니다. 이후 "라이트" 버퍼가 다 차면 "라이트" 버퍼를 메모리에 업데이트합니다.
 
ARM 프로세서의 캐시
 
ARM 프로세서가 실행할 때 처리되는 데이터와 어셈블리 명령어와 메모리에 엑세스하는 데이터와 같은 패턴으로 분류할 수 있습니다. ARM 명령어와 같이 명령어에 대한 데이터를 저장하고 관리하는 캐시를 인스트럭션 캐시(Instruction Cache)라고 부르며 메모리에 저장되는 데이터를 관리하는 캐시는 데이터 캐시(Data Cache)라고 정의합니다.
 
ARMv7 아키텍처에의 메모리 계층 구조를 나타내는 다음 그림을 보면서 캐시에 대해 알아봅시다. 
 

 
그림 1.7 ARM의 캐시 계층 구조
 
그림의 가장 왼쪽 아랫 부분에 보이는 R0, R15는 ARM 코어에 있는 레지스터를 의미합니다. 오른쪽을 보면 Level1 Cache와 Level2 Cache가 보이는데 이는 이번 절에서 설명한 CPU 캐시를 의미합니다.
 
여기서 Level이란 단어가 보이는데 이 용어의 의미는 무엇일까요? Level은 단계와 수치를 의미하며, Level1 캐시는 1단계 캐시, Level2 캐시는 2단계 캐시라고 해석하면 됩니다. 보통 Level 1 캐시는 L1 캐시, Level 2 캐시는 L2 캐시라고 부르는데, CPU에서는 먼저 L1 캐시에 접근해 데이터를 찾는데 만약 데이터가 없다면 순서대로 L2 캐시에 접근해 찾는 데이터가 있는지 체크합니다. 
 
"이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!"
 
​Thanks,
Guillermo Austin Kim(austindh.kim@gmail.com)
 
 
 
< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>
 
 
* 유튜브 소개 영상

+ Recent posts