본문 바로가기
AI & CS 지식/컴퓨터구조

[혼공컴운] 6. 메모리와 캐시 메모리

by rahites 2024. 8. 25.

메모리와 캐시 메모리

1. RAM의 특징과 종류

주기억장치의 종류에는 크게 RAM과 ROM이 존재한다. 하지만 우리가 일상 생활에서 다른 사람들과 메모리 관련 이야기를 할 때 ROM에 대해서는 거의 이야기 하지 않고 "RAM이 부족하다", "RAM을 32GB로 늘려야 한다"와 같이 메모리하면 RAM을 먼저 떠올린다. 그만큼 컴퓨터에서의 ROM의 역할은 줄어들고 RAM이 대부분의 메모리 역할을 수행 하는데, 때문에 이번 장에서는 RAM이 무엇인지에 대해 자세히 알아보는 시간을 갖는다.

ROM은 한번 기록한 데이터를 다시 기록할 수 없어 현대 사회에서의 중요성이 떨어지고 있다(비휘발성 메모리로 주로 메인보드 안에서 BIOS 데이터를 가지고 있음).

 

RAM의 특징

RAM에는 실행할 프로그램의 명령어와 데이터가 저장된다. ROM과 달리 RAM은 휘발성 메모리이기 때문에 일반적으로 비휘발성 저장 장치에 보관할 대상을 저장하고 RAM에는 실행할 대상을 저장한다(실행하고자 하는 프로그램이 보조기억장치에 있다면 RAM으로 복사한 후 실행).

 

RAM의 용량과 성능

위에서 RAM은 실행하고자 하는 프로그램을 보조기억장치에서 RAM으로 복사해와야 한다고 설명하였다. 이 때 RAM의 용량이 적다면 보조기억장치에서 프로그램을 복사해올 때 프로그램을 가져오는 일이 잦아져 실행시간이 길어지게 된다.

 

예를 들어 보조기억장치에 내가 실행해야 할 프로그램 A, B, C(동일한 크기)가 저장되어 있다고 해보자. 

 

1. RAM의 크기가 프로그램 하나만을 저장할 수 있는 사이즈라면

: 프로그램 A를 실행하고 싶을 때 RAM에다가 A를 복사하고, B를 실행하고 싶을 때 B를 복사하는 등 한번에 1개의 프로그램만을 처리

 

2. RAM의 크기가 프로그램 3개를 모두 저장할 수 있는 사이즈라면

: 프로그램 A, B, C를 한번에 복사하여 원하는 프로그램을 자유롭게 실행하는 것이 가능

 

위와 같이 RAM의 용량이 크면 많은 프로그램들을 동시에, 빠르게 실행하는데에 유리하다. 물론 그렇다고 해서 RAM의 용량이 커지는만큼 실행 속도가 비례하여 커지는 것은 아니다.

 

RAM의 종류

RAM의 종류는 크게 DRAM, SRAM, SDRAM, DDRSDRAM이 있다.

 

1. DRAM(Dynamic RAM)

DRAM은 데이터가 동적으로(Dynamic) 변하는(사라지는) RAM을 의미한다. 즉, 시간이 지나면 저장된 데이터가 사라지는 RAM을 의미하며 데이터가 사라지는 것을 막기 위해서는 일정 주기로 데이터를 저장해주어야 한다.

 

이러한 단점이 존재하지만, 가장 대중적으로 사용되는 RAM의 형태이며 소비 전력이 낮고 저렴하다는 것 뿐만 아니라 집적도가 높아 대용량으로 설계하기가 용이하다는 장점을 가진다.

 

2. SRAM(Static RAM)

SRAM은 DRAM과 달리 시간이 지나도 저장된 데이터가 사라지지 않는다. 따라서 일정 주기로 데이터를 재활성화해줄 필요가 없으며 DRAM보다 속도도 더 빠르다.

물론 RAM은 휘발성 메모리이기때문에 전원이 공급되지 않으면 저장된 내용이 날라간다.

위와 같은 장점에도 불구하고 SRAM은 집적도가 낮고, 소비 전력이 크며, 가격이 더 비싸다는 단점 때문에 일반적으로 SRAM보다 DRAM을 사용한다. 따라서 SRAM은 대용량으로 만들어질 필요는 없지만 속도가 빨라야 하는 저장 장치에서 주로 사용된다(ex. 캐시 메모리).

 

3. SDRAM(Synchronous Dynamic RAM)

SDRAM은 SRAM + DRAM이 아니다. 클럭 신호와 동기화 된 DRAM의 발전된 형태이다. "여기서 클럭 신호와 동기화되었다"는 것은 클럭 타이밍에 맞춰 CPU와 정보를 주고받을 수 있다는 뜻이다.

 

즉 SDRAM은 클럭에 맞추어 동작하며 클럭마다 CPU와 정보를 주고 받을 수 있는 DRAM이다.

 

4. DDR SDRAM(Double Data Rate SDRAM)

DDR SDRAM은 최근 가장 자주 사용되는 RAM의 형태이다(ex. DDR4, DDR5 등). DDR이란 Double Data Rate의 준말로 대역폭(Data Rate)을 넓혀 속도를 빠르게 만든 SDRAM을 의미하며 여기서 대역폭이란 데이터를 주고받는 길의 너비를 의미한다. 일반 SDRAM보다 대역폭이 넓어 한 클럭당 2번씩 CPU와 데이터를 주고받을 수 있기 때문에 전송속도가 2배가량 빠르다.

 

이런식으로 DDR2는 DDR 대역폭의 2배, DDR3는 DDR2의 2배, DDR4는 DDR3의 2배 등 다음 세대(숫자) DDR SDRAM은 이전 세대의 2배의 대역폭을 가진다. 

 

2. 메모리의 주소 공간

메모리에 저장된 정보의 위치는 물리 주소논리 주소로 나타낼 수 있다. 

  • 물리 주소 : 메모리 하드웨어가 사용하는 주소
  • 논리 주소 : CPU와 실행 중인 프로그램이 사용하는 주소

CPU와 현재 실행중인 프로그램은 메모리 몇 번지에 어떤 정보가 저장되어 있는지 알지 못한다. 이는 메모리의 저장된 정보가 계속하여 변하기 때문인데, 예를 들어 1000번지에 적재되어 실행된 프로그램을 다시 실행하면 2000번지에 적재되게 된다. 

 

이 때문에 실제 실행 중인 프로그램이 하드웨어 상으로 차지하는 물리 주소(Physical Address)에 더하여 CPU와 실행 중인 프로그램이 사용하는 논리 주소(Logical Address)가 존재한다. 논리 주소는 실행 중인 프로그램 각각에게 부여되는 0번지부터 시작되는 자신만의 주소를 의미한다. 예를 들어 크롬, 메모장, 게임 3개의 프로그램이 실행중이라면 각각의 프로그램이 0번지부터 시작되는 자신만의 논리 주소를 가져 크롬은 0~4번지, 메모장은 0~1번지, 게임은 0~7번지 주소를 각각 가질 수 있다.

 

CPU가 이해하는 주소는 논리 주소이지만, CPU와 메모리가 상호작용하기 위해서는 논리 주소와 물리 주소간의 변환이 이뤄져야 한다. 이러한 변환은 CPU와 주소 버스 사이에 위치한 메모리 관리 장치(MMU; Memory Management Unit)에 의해 수행된다. MMU는 CPU가 발생시킨 논리 주소에 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다. 예를 들어 저장된 논리 주소가 100번지 + 베이스 레지스터가 저장된 물리 주소가 1000번지 = 메모리에 저장된 주소 10100번지

베이스 레지스터에는 실행되고 있는 프로그램이 저장된 기준 주소(메모리 물리 주소)가 저장되어 있음

베이스 레지스터 주소 지정 방식으로 생각하면 비슷한 것 같다.

 

메모리 보호 기법

앞서 예시로 든 크롬, 메모장, 게임이 각각 물리 주소 1000~1999번지, 2000~2999번지, 3000~3999번지에 저장되어있다고 생각해보자. 이 때 "크롬 프로그램의 논리 주소 1350번지에 숫자 58을 저장하라"라는 명령어가 있다면 이러한 명령어는 수행될 수 있을까?

 

답은 "수행될 수 없다"이다. 그 이유는 요구 명령어가 크롬 프로그램의 논리 주소 영역을 벗어났기 때문이다. 위 명령어가 수행되게 된다면 2350번지에 위치한 애꿎은 메모장 프로그램에 영향을 주게 된다. 이러한 문제를 방지하기 위해 한계 레지스터(Limit Register)가 존재한다.

 

베이스 레지스터실행 중인 프로그램의 가장 작은 물리 주소가 저장된다면, 한계 레지스터에는 논리 주소의 최대 크기를 저장한다. 즉, 프로그램의 물리 주소 범위는 [베이스 레지스터 값] ~ [베이스 레지스터 값 + 한계 레지스터 값] 미만이 된다.

 

CPU는 메모리에 접근하기 전에 접근하고자 하는 논리 주소가 한계 레지스터 값보다 작은지를 항상 검사하며 만약 더 높은 논리 주소에 접근하려 하면 인터럽트(트랩)을 발생시킨다.

 

3. 캐시 메모리

일반적으로 CPU의 연산 속도보다 CPU가 메모리에 접근하는데 걸리는 시간이 더 오래걸린다. 그렇다면 당연히 CPU의 연산 속도를 빠르게 만드는 것도 중요하지만 CPU가 메모리에 접근하는데 걸리는 시간을 줄이는게 전체 수행 시간을 줄이는데 도움이 되지 않을까?

 

그래서 사용하는 저장 장치가 바로 캐시 메모리이다. 

 

캐시 메모리를 이해하기 위해 우선 저장 장치 계층 구조라는 개념을 공부해 보도록 하겠다.

 

일반적으로 저장 장치는 빠를수록, 용량이 클수록 좋다고 말하지만 실제로 두가지를 모두 만족하는 저장 장치는 존재하기 어렵다. 그 이유는 다음과 같다.

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

예를 들어 CPU와 가장 가까운 저장 장치인 레지스터는 일반적으로 RAM보다 용량은 작지만 접근 시간이 빠르고 가격이 비싸다. 이와 같이 값이 싼 대용량 저장 장치를 원한다면 느린 속도는 감수해야 하고, 빠른 속도를 원한다면 작은 용량과 비싼 가격을 감수해야 한다.

 

저장 장치들이 가지는 장단점이 명확하기 때문에 우리는 일반적으로 다양한 저장 장치를 사용한다. 이 때 사용하는 저장 장치들이 CPU에 얼마나 가까운지를 기준으로 계층적으로 나타낸 것을 저장 장치 계층 구조(Memory Hierarchy)라고 한다.

위쪽 계층에 위치할수록 빠르고, 용량이 작고, 비싸며 아래 계층에 위치할 수록 속도가 느리고, 용량이 크며, 가격이 저렴하다.

 

캐시 메모리(Cache Memory)

앞서 설명한 것처럼 CPU가 메모리에 접근하는 속도가 느리기 때문에 컴퓨터에서는 캐시 메모리를 사용한다. 캐시 메모리는 CPU와 메모리 사이에 위치하고, 레지스터보다 용량이 크며 메모리보다 빠른 SRAM 기반의 저장 장치이다. 

 

캐시 메모리는 CPU의 연산 속도와 메모리 접근 속도의 차이를 줄이기 위해 사용하며 CPU가 매번 메모리에서 데이터를 가져오는 것은 시간이 오래 걸리니 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 활용한다.

 

캐시 메모리까지 반영한 저장 장치 계층 구조는 다음과 같다.

위 쪽에 위치할 수록 빠르고, 용량이 작고, 비싸다

우리가 일반적으로 사용하는 컴퓨터에는 여러 개의 캐시 메모리가 존재한다. 이 캐시 메모리들은 CPU와 가까운 순서대로 계층을 구성하여 L1 캐시(Level1 캐시), L2 캐시, L3 캐시라고 부른다. 일반적으로 L1 캐시와 L2 캐시는 CPU 내부에, L3 캐시는 CPU 외부에 위치한다.

 

즉, 위에 보이는 저장 장치 계층 구조 중 캐시 메모리 파트는 L1 캐시 - L2 캐시 - L3 캐시로 구분될 수 있다. 

CPU와 가장 가까운 L1 캐시는 접근 속도를 조금이라도 빠르게 만들기 위해 L1 캐시를 분리하는 경우도 있다. 명령어 만을 저장하는 L1 캐시인 L1I 캐시와 데이터만을 저장하는 L1D 캐시로 분리할 수 있으며 이를 분리형 캐시(Split Cache)라고 한다.

 

참조 지역성 원리

캐시 메모리는 메모리보다 용량이 작기 때문에 메모리에 존재하는 모든 내용을 저장할 수 없다. 따라서 캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장한다. 이 때 자주 사용할 것으로 예측하여 캐시 메모리에 저장한 데이터가 실제로 CPU에서 활용될 경우를 캐시 히트(Cache Hit)라고 부른다. 반대로 예측이 틀려 사용되지 않을 경우는 캐시 미스(Cache Miss)라고 한다. 캐시 미스가 자주 발생하면 CPU가 필요한 데이터를 메모리에서 직접 가져와야 하기 때문에 성능이 떨어진다.

 

캐시가 히트되는 비율을 캐시 적중율(Cache Hit Ratio)라고 한다.

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

일반적으로 우리가 사용하는 컴퓨터의 캐시 적중율은 85% ~ 95%이다. 그렇다면 컴퓨터는 어떻게 CPU가 사용할 데이터를 예측하는 것일까?

 

캐시 메모리는 한 가지 원칙에 따라 CPU가 사용할 데이터를 예측한다. 이는 참조 지역성의 원리(Locality of Reference, Principle of Locality)로서 다음과 같은 CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어졌다.

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

1. CPU는 왜 최근에 접근했던 메모리 공간에 다시 접근하려는 경향을 가질까?

코딩을 하다보면 우리는 "변수"에 특정 값을 저장하게 된다. 이러한 행위는 우리가 특정 값을 다시 사용하기 위함이며 이는 결국 CPU 속에서 변수에 특정 공간을 할당하고, 이 공간을 다시 접근할 것이라는 의미가 된다. 이렇게 최근에 접근했던 메모리 공간에 다시 접근하려는 경향을 시간 지역성(Temporal Locality)라고 부르며 일반적으로 CPU는 이러한 시간 지역성의 특징을 가진다.

 

2. CPU는 왜 접근한 메모리 공간 근처를 접근하려는 경향을 가질까?

CPU가 실행하려는 프로그램은 보통 관련된 데이터끼리 모여 저장된다. 예를 들어 Word, Chrome, 게임 3가지 프로그램이 실행된다면 서로 관련 있는 데이터끼리 모여 저장된다(Word 관련 데이터끼리, Chrome 관련 데이터끼리, 게임 관련 데이터끼리). 또한 하나의 프로그램 내에서도 관련 있는 데이터들은 모여서 저장된다.

 

따라서 CPU가 Word 프로그램을 사용할 경우 Word 프로그램 근처를, Chrome 프로그램을 사용할 경우 Chrome 프로그램 근처를 집중적으로 접근할 것이다. 이렇듯이 접근한 메모리 근처를 접근하려는 경향을 공간 지역성(Spatial Locality)라고 한다.

 

결국 캐시 메모리는 CPU의 시간 지역성공간 지역성을 바탕으로 만들어진 참조 지역성의 원리를 기반으로 CPU가 사용할 데이터를 예측한다.

댓글