본문 바로가기

Computer Science/컴퓨터 구조

컴퓨터 구조 - 캐시 메모리

캐시 메모리

 

CPU는 프로그램을 실행하는 과정에서 메모리에 저장된 데이터를 자주 참조합니다. 하지만 CPU가 메모리에 접근하는 시간은 CPU 연산 속도보다 느립니다. 이러한 차이를 극복하기 위한 저장 장치를 캐시 메모리라고 합니다.

 

저장 장치 계층 구조(Memory hierachy)

  • CPU와 가까운 저장 장치는 빠르고, 멀리 있는 장치는 느리다.
  • 속도가 빠를 수록 용량이 작고, 가격이 비싸다.

저장 장치는 일반적으로 위와 같은 명제를 따릅니다. 예를 들어 CPU와 가까운 레지스터는 일반적으로 RAM보다 용량이 작지만, 접근 시간이 압도적으로 빠르고 가격이 비쌉니다. 그리고 USB 메모리보다 RAM이 CPU보다 더 가깝기 때문에 접근 시간이 더 빠르지만, 가격이 비교적 더 비쌉니다.

 

이처럼 컴퓨터가 사용하는 저장 장치들을 CPU와 얼마나 가까운가를 기준으로 계층적으로 나타낸 것을 저장 장치 계층 구조라고 합니다.

 

저장 장치 계층 구조

  • CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 느립니다.
  • 그럼에도 CPU는 프로그램을 실행하는 과정에서 메모리에 빈번하게 접근해야만 합니다.

위와 같은 특성 때문에 등장한 것이 캐시 메모리입니다. CPU와 메모리 사이에 위치하고, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반 저장 장치입니다. 캐시 메모리는 L1 캐시, L2 캐시, L3 캐시가 있습니다. L1, L2, L3 순으로 코어와 가깝습니다. 일반적으로 L1 캐시와 L2 캐시는 코어 내부, L3 캐시는 코어 외부에 위치해 있습니다.

 

멀티코어 프로세서 환경에서는 L3 캐시는 공유하고, L1 캐시와 L2 캐시는 코어가 각각 갖고 있는 형태가 됩니다. 또한 코어와 가장 가까운 L1 캐시는 명령어와 데이터를 각각 저장하는 L1I 캐시와 L1D캐시로 분리하는 경우도 있습니다. 이를 분리형 캐시(split cache)라고 합니다.

 

 

 

참조 지역성의 원리

 

캐시 메모리는 앞서 언급했듯이 레지스터보다는 용량이 크지만 메모리보다는 용량이 작습니다. 그렇기 때문에 메모리의 모든 내용을 저장할 수는 없습니다. 때문에 캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장합니다. 이때 자주 사용될 것으로 예측한 데이터가 실제로 캐시 메모리 내 데이터를 CPU가 활용할 경우 캐시 히트(cache Hit), 그렇지 않아 메모리에서 필요한 데이터를 직접 가져와야하는 경우를 캐시 미스(cache Miss)라고 합니다. 캐시가 히트되는 비율을 캐시 적중률(cache Hit ratio)라고 하며, 다음과 같이 계산합니다.

캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)

 

그렇다면 CPU가 사용할 법한 대상을 어떻게 예측할 수 있을까요? 캐시 메모리는 참조 지역성의 원리에 따라 메모리부터 가져올 데이터를 결정합니다.

  • CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다. (시간 지역성)
  • CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다. (공간 지역성)

 

시간 지역성

 

예를 들어 다음과 같은 코드가 있습니다.

#include <stdio.h>

int main()
{
    int num = 2;
    
    for(int i = 1; i <= 9; i++)
    	printf("%d X %d = %d\n", num, i, num * i);
        
    return 0;
}

 

위 코드에서 변수는 num 과 i 입니다. 이 두 변수는 for문 내 printf() 함수에 의해 여러 번 사용되고 있습니다. 이렇게 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있습니다.

 

공간 지역성

 

메모리에 저장되는 데이터들은 관련있는 데이터끼리 모여서 저장됩니다. 예를 들어 워드 프로세서 프로그램의 자동 저장 기능, 입력 기능, 출력 기능 등 각 기능과 관련한 데이터는 모여서 메모리에 저장됩니다. 여기서 CPU가 워드 프로세서 프로그램을 실행하면 워드 프로세서 프로그램이 모여 있는 공간 근처를 집중적으로 접근할 것이고, 사용자가 입력 기능을 사용하면 입력 기능 데이터가 모인 곳을 집중적으로 접근할 것입니다. 이처럼 접근한 메모리 공간 근처를 접근하려는 경향이 있습니다.

 

공부 내용에 쓰인 이미지는 유튜브 채널 '개발자 강민철' 에서 스크랩했습니다.

https://www.youtube.com/@kangminchul