TIL

[TIL/혼공컴운] 2025/01/20

메모리와 캐시 메모리 ✍️RAM은 Random Access Memory의 약어다. RAM에는 우리가 실행할 프로그램의 명령어와 데이터가 저장된다.컴퓨터의 전원을 끄면, RAM에 저장된 명령어와 데이터가 모두 날아가는 곤란한 상황을 조우하게 된다. 이처럼 전원을 끄면 저

2025년 1월 20일6min read

메모리와 캐시 메모리 ✍️

1. RAM의 특징과 종류 ⚙️

1-1. RAM의 특징 🌿

RAM은 Random Access Memory의 약어다. RAM에는 우리가 실행할 프로그램의 ``명령어와 데이터``가 저장된다.

컴퓨터의 전원을 끄면, RAM에 저장된 명령어와 데이터가 모두 날아가는 곤란한 상황을 조우하게 된다. 이처럼 전원을 끄면 저장된 내용이 사라지는 저장 장치를 ``휘발성 저장 장치(volatile memory)``라고 한다.

이에 반해, 전원이 꺼져도 저장된 내용이 유지되는 저장 장치는 ``비휘발성 저장 장치(non-volatile memory)``라고 한다. 하드 디스크나 SSD, CD-ROM과 같은 보조기억장치가 대표적인 비휘발성 저장 장치다.

보조기억장치-RAM-CPU의 동작 흐름은 다음과 같다.

CPU는 보조기억장치에 직접 접근하지 못한다. 따라서 CPU가 실행 하고 싶은 프로그램이 보조기억장치에 있다면, 이를 RAM에 복사하여 저장한 뒤 실행한다.

1-2. RAM의 용량과 성능 🌿

RAM의 용량과 컴퓨터 성능 간의 상관관계를 살펴보자.

CPU가 실행하고자 하는 프로그램이 보조기억장치에 있다면 RAM으로 복사해야 하는데, RAM의 용량이 작다면 보조기억장치에서 실행할 프로그램을 가져오는 일이 잦아 실행 시간이 길어진다.

RAM의 용량이 충분히 크다면 보조기억장치에서 많은 데이터를 가져와 미리 RAM에 저장할 수 있기에, 프로그램의 동시 실행에 유리하다.

그렇지만 RAM의 용량이 커질수록 프로그램 실행 속도가 비례해서 빨라지는 것은 아니다. 보조기억장치가 책장이고 RAM이 책상이라고 가정해 보자.

책상이 넓을수록 미리 여러 권의 책을 쌓아둘 수 있어, 책장으로 책을 가지러 왔다 갔다 하는 시간을 절약할 수 있지만, 책을 100권을 쌓아 놓든 1000권을 쌓아 놓든 책장을 오가는 시간에는 별 차이가 없게 되는 것과 같다.

1-3. RAM의 종류 🌿

대표적인 RAM 네 가지에 대해 살펴보자.

#### 1-3-1. DRAM(Dynamic RAM) 🚀

DRAM에서 Dynamic은, RAM에 저장된 데이터가 시간이 지나면 동적으로 사라짐을 의미한다. 즉 데이터의 소멸을 막기 위해서는 데이터를 재활성화(다시 저장) 해야 한다.

우리가 일반적으로 메모리로써 사용하는 RAM은 DRAM이다. 소비 전력이 비교적 낮고, 저렴하며, 집적도가 높기에 대용량으로 설계하기 용이하다는 장점이 있다.

#### 1-3-2. SRAM(Static RAM) 🚀

SRAM의 S는 static을 뜻한다. 시간이 지나도 저장된 데이터가 사라지지 않는다. 당연하게 주기적으로 데이터를 재활성화할 필요도 없다.

그런데 오해하면 안 되는 것이, '시간의 흐름'에 의해 데이터가 소멸되지 않는다는 것이지 SRAM이 비휘발성 메모리인 것은 아니다.

SRAM은 DRAM에 비해 소비 전력이 크고, 비싸며, 집적도가 낮기에 메모리보다는 캐시 메모리에서 사용되는 경우가 많다. 캐시 메모리에 대해서는 후술할 예정이다.

#### 1-3-3. SDRAM(Synchronous Dynamic RAM) 🚀

SDRAM의 S는 static과는 관계가 없다. 여기서의 s는 synchronous를 의미한다. 클럭 신호와 '동기화'된, 발전된 형태의 DRAM이다.

클럭 신호와 동기화되었다는 것은, 클럭 타이밍에 맞춰 CPU와 정보를 주고받을 수 있음을 의미한다.

#### 1-3-4. DDR SDRAM(Double Data Rate SDRAM) 🚀

클럭 신호와 동기화된 DRAM인 SDRAM의 대역폭을 넓혀 속도를 빠르게 만든 SDRAM이 바로 DDR SDRAM이다.

클럭 타이밍에 맞춰, 한 클럭 당 두 번씩 CPU와 데이터를 주고받을 수 있다. SDR(Single Data Rate) SDRAM의 대역폭 2배가 DDR SDRAM이다. 최근에 흔히 사용하는 DDR4 SDRAM은 SDR SDRAM에 비해 16배 넓은 대역폭을 가진다.

2. 메모리의 주소 공간 ⚙️

2-1. 물리 주소와 논리 주소 🌿

메모리에는 일반적으로 '주소'가 저장되는데, 주소에는 두 가지 종류가 있다.

만약 현재 메모리에 메모장, LOL, 크롬 프로그램이 적재되어 있다고 가정해 보자. 각각의 프로그램들은 다른 프로그램들의 물리 주소가 무엇인지 굳이 알 필요가 없다. 새로운 프로그램이 언제든 적재될 수 있고, 실행되지 않는 프로그램은 언제든 메모리에서 사라질 수 있기 때문이다.

중요한 것은, CPU가 메모리와 상호작용하려면 논리 주소와 물리 주소 간 변환이 이루어져야 한다. 논리 주소와 물리 주소 간의 변환은 MMU(Memory Management Unit)라는 CPU와 주소 버스 사이에 위치한 하드웨어에 의해 수행된다. 변환 흐름은 다음과 같다.

베이스 레지스터는 프로그램의 첫 물리 주소를 저장하는 셈이고, 논리 주소는 프로그램의 시작점으로부터 떨어진 거리인 셈이다.

일전에 변위 주소 지정 방식 중 '베이스 레지스터 주소 지정 방식'에서, 오퍼랜드를 '기준 주소로부터 떨어진 거리'라고 설명해서 조금 의아했다. 베이스 레지스터 주소 지정 방식에서 오퍼랜드 필드에 할당되는 값이 논리 주소고, "논리 주소가 일종의 오프셋 역할을 하는 것이구나!"라는 아하 모먼트가 왔다.

2-2. 메모리 보호 기법 🌿

논리 주소가 0번지부터 999번지인 메모장 프로그램에, CPU가 "메모장 1500번지에 숫자 100을 저장하라!"와 같은 명령을 내리면 예기치 못한 동작에 의해 상당히 피곤해진다. 뜬금없이 게임 프로그램 정보가 삭제될 수도 있다.

즉 이번 파트에서 말하고자 하는 메모리 보호란, '논리 주소 영역을 벗어났을 때'의 메모리 보호를 뜻한다.

이처럼 논리 주소 범위를 벗어나는 명령어 실행을 방지하고, 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요할 것인데, 이를 한계 레지스터가 담당하게 된다. 말이 어려우니 그림으로 확인해 보자.

한계 레지스터에는 논리 주소의 최대 크기가 저장된다. 따라서 특정 프로그램의 물리 주소 범위는 ``베이스 레지스터 값 이상 ~ 베이스 레지스터 값 + 한계 레지스터 값 미만``이라고 볼 수 있다.

따라서 만약 논리 주소가 한계 레지스터에 저장된 값보다 높은 값에 접근하려 한다면 인터럽트가 발생되어 명령어의 실행이 중단된다.

3. 캐시 메모리 ⚙️

3-1. 저장 장치 계층 구조 🌿

CPU가 메모리에 접근하는 시간은 CPU의 연산 속도보다 느리다. 이를 극복하기 위한 장치가 캐시 메모리다. 그런데 캐시 메모리를 설명하기 전에 ``저장 장치 계층 구조``라는 개념에 대한 논의가 선행되어야 한다.

속도가 빠르고 용량이 크며 가격이 저렴한 저장 장치는 없다. 각각의 저장 장치의 장단점이 명확하기 때문에 목적에 맞게 사용하는 것이 중요하다.

즉 저장 장치 계층 구조란 ``CPU와 얼마나 가까운가``를 기준으로 나뉜 계층이다.

3-2. 캐시 메모리 🌿

캐시 메모리는 레지스터와 메모리 간의 타협이다. 즉, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장 장치가 바로 캐시 메모리인 것이다.

CPU가 매번 메모리에 왔다 갔다 하는 건 시간이 오래 걸리기에, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 활용하자는 것이고 이를 '캐싱'한다고 표현한다.

캐시 메모리도 CPU과 근접한 순서대로 계층을 구성한다. 전체적인 구조는 다음과 같다.

코어와 가장 근접한 캐시 메모리를 L1 캐시, 다음을 L2, 다음을 L3 캐시라고 부른다. 일반적으로 L1, L2 캐시는 코어 내부에, L3 캐시는 코어 외부에 위치한다.

분리형 캐시라고 해서 L1 캐시의 분리 형태도 있다. 핵심은, 저장 장치의 특성과 그 차이를 이해하는 것이다.

3-3. 참조 지역성 원리 🌿

캐시 메모리로, 메모리에 있는 모든 내용을 가져다 저장할 수는 없다. 그렇다면 ``캐시 메모리에 무엇을 저장해야 하는가``가 핵심이다. 캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장한다. 이 예측이 맞는 경우를 캐시 히트, 틀리는 경우를 캐시 미스라고 부르고, 캐시가 히트되는 비율을 캐시 적중률이라고 부른다.

우리가 사용하는 일반적인 컴퓨터의 캐시 적중률은 85~95% 이상이다.

그런데 "캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장한다"라고 했는데, 그 기준은 뭔데?라는 생각이 든다. 그 원칙이 바로 ``참조 지역성의 원리(locality of reference)``다.

참조 지역성의 원칙은 ``시간 지역성(temporal locality)``공간 지역성(spatial locality)``으로 동작한다.

시간 지역성은 변수를 생각하면 편하다. 구구단 예시를 보자.

code
const start = 2; 
const end = 9;   
const maxMultiplier = 9; 

for (let i = start; i <= end; i++) {
  console.log(`\n${i}단`);
  for (let j = 1; j <= maxMultiplier; j++) {
    console.log(`${i} x ${j} = ${i * j}`);
  }
}

구구단 결과를 출력하는 과정에서 변수들이 여러 번 사용되고 있다. 이렇게 '최근 접근했던 메모리 공간에 다시 접근하려는 경향'을 시간 지역성이라고 한다.

공간 지역성은 말 그대로 공간에 대한 집중적 접근이다.

워드 프로세서 기능들은 관련 데이터들이 모여 저장되고, 게임 기능들은 게임 관련 데이터들이 모여 저장된다. CPU가 워드 프로세서 프로그램을 실행할 때에는 워드 프로세서 프로그램이 모여 있는 공간 근처를 집중적으로 접근할 것이고, 이후 사용자가 '입력'을 할 때에는 입력 기능이 모여 있는 공간 근처를 집중적으로 접근할 것이다.

즉, 캐시 메모리는 참조 지역성 원리(시간+공간)에 입각해 CPU가 사용할 법한 데이터를 예측한다.

회고 ✍️

처음 보는 글을 읽고 매주 두 편 정도로 정리한다. 잘 이해했는지 확인하기 위해 프로젝트를 진행한다. 10년이면, 대충 계산해도 책은 100권 정도 읽을 것이고 TIL은 1300편이 넘어갈 것이다. 실무를 하며 재미있는 것도 많이 만들겠지.

당장 1~2년 잘 하는 것도 중요한데, 힘들게 찾은 좋아하는 일을 오래 그리고 잘 하고 싶은 마음이 크다. 단순함을 꾸준히 반복하면,,, 이건 뭐 안 되려야 안 될 수가 없겠다는 생각이 든다. 더 지독하게 꾸준해지려 노력해야지.