Priv's Blog
5. RAM 본문
1. RAM
RAM은 대표적인 주기억장치에 해당하는 메모리이다.
DRAM, SRAM, SDRAM, DDR SDRAM 등이 있다.
1.1) RAM의 특징
RAM은 휘발성 저장 장치에 해당하기 때문에 전원이 꺼지면 저장된 데이터들이 모두 지워진다.
이 단점 때문에 비휘발성 저장 장치에 해당하는 HDD, SSD 등의 보조기억장치를 별도로 사용하는 것이다.
RAM은 주기억장치이기 때문에 CPU가 직접 접근할 수 있다.
그래서 일반적으로는 RAM에 실행할 대상을, HDD/SSD에는 보관할 대상을 저장한다.
CPU가 실행할 대상이 보조기억장치에 있다면, 보조기억장치의 데이터를 복사해 RAM으로 가져와 실행한다.
1.2) RAM의 용량 및 성능
RAM의 성능을 결정하는 가장 기본적인 정보가 용량이다.
RAM의 용량이 적다면 보조기억장치에 접근해야 하는 빈도가 높아지며, 이는 어쩔 수 없는 속도 저하를 발생시킨다.
RAM의 용량이 크다면 보조기억장치에서 여러 명령어들을 가져와 저장해 둘 수 있으므로, CPU가 바로바로 RAM에서 명령어를 참조해 실행할 수 있다.
다만, RAM의 용량은 프로그램 실행 속도와 비례하지 않는다.
1.3) RAM의 종류
- DRAM
DRAM은 Dynamic RAM의 준말이다.
즉, 저장된 데이터들이 동적으로 변하는 RAM이다.
시간이 지나면 저장된 데이터들이 삭제되기 때문에 주기적으로 데이터를 다시 저장시켜야 한다.
소비 전력이 낮고, 싸며, 집적도가 높아 대용량 설계가 유리하다는 점 때문에 대부분의 RAM이 DRAM 형식이다.
- SRAM
SRAM은 Static RAM의 준말이다.
DRAM과 달리 저장된 데이터들이 정적으로 저장되기 때문에 시간이 지나도 저장된 내용이 소실되지 않는다.
하지만 소비 전력이 높고, 비싸며, 집적도가 낮아 대용량 설계가 불리하기 때문에 캐시처럼 저용량, 고속 메모리를 제작할 때 쓰인다.
- SDRAM
SDRAM은 Synchronous Dynamic RAM의 약자이다.
클럭 신호와 동기화되는 RAM이라는 뜻인데, 이는 클럭 타이밍에 맞춰서 CPU와 정보 교환이 가능하다는 것을 말한다.
- DDR SDRAM
Double Data Rate SDRAM은 가장 흔하게 쓰이는 RAM이다.
대역폭을 넓혀서 더 많은 데이터를 주고받을 수 있게 만든 SDRAM으로, 이름에서 알 수 있듯이, SDRAM 대역폭의 2배이다.
즉, DDR1 SDRAM은 SDRAM의 2배, DDR2 SDRAM은 SDRAM의 4배이다.
2. 메모리 주소 공간
메모리는 물리 주소, 논리 주소 2가지 종류의 주소를 사용한다.
메모리 하드웨어가 사용하는 실제 주소는 물리 주소, CPU가 실행 중인 프로그램이 사용하는 주소는 논리 주소이다.
2.1) 물리 주소, 논리 주소
CPU는 현재 실행 중인 프로그램이 몇 번째 메모리 주소에 저장되어 있는지 알 수 없다.
메모리 정보는 시시각각 변하기 때문에 새로 실행되는 프로그램이 적재되면 메모리 주소가 결정되고, 프로그램 실행이 끝나면 메모리에서 삭제된다.
같은 프로그램을 실행하더라도 상황과 변수에 따라 메모리 주소가 달라지기도 해서 이에 대한 모든 정보를 CPU가 다 기억할 수는 없다.
물리 주소는 메모리의 하드웨어 상에 기록된 실제 주소이다.
논리 주소는 CPU와 실행 중인 프로그램이 사용하는 주소로, 0번지부터 시작된다.
이 차이는 그림으로 표현해야 쉽게 이해할 수 있다.
CPU가 메모리와 상호작용을 하기 위해서는 논리 주소가 물리 주소로 변환되어야 한다.
이 변환 작업은 메모리 관리 장치, MMU가 수행한다.
MMU의 베이스 레지스터에 저장된 주소와 CPU가 요청한 논리 주소를 합쳐서 실제 물리 주소를 찾아내는 방식으로 연산이 이루어진다.
2.2) 메모리 보호 기법
프로그램이 자신의 물리 주소 영역을 벗어나는 영역을 건드리는 명령어를 제공하면, 당연히 수행되서는 안 된다.
인터넷 브라우저 프로그램의 명령어가 메모장 프로그램의 영역을 건드리는 명령어를 제공한다면 큰 오류가 발생할 수 있다.
즉, 다른 프로그램의 메모리 영역을 침범하는 명령어는 실행되지 않도록 걸러주는 작업이 필요하다.
이는 한계 레지스터라는 레지스터가 담당한다.
베이스 레지스터가 프로그램의 시작 부분 주소를 저장하는 레지스터라면, 한계 레지스터는 프로그램이 차지하는 논리 주소의 최대 크기를 저장한다.
즉, 프로그램의 물리 주소 범위는 베이스 레지스터의 값과 한계 레지스터의 값을 더한 주소 값이 된다.
CPU가 접근하려는 논리 주소는 이 한계 레지스터 범위를 넘어서면 안 된다.
만약 접근하려는 시도가 벌어질 경우, 이를 오류로 판단하고 인터럽트(트랩)를 발생시켜 프로그램 실행을 중단시켜 버린다.
3. 캐시 메모리
CPU는 주기억장치(RAM)에서 명령어를 끌어와서 실행한다.
하지만 CPU가 메모리에 접근하는 시간은 생각보다 상당히 오래 걸린다.
CPU가 아무리 빠른 연산 속도를 지니고 있다고 해도, 처리해야 할 명령어를 불러올 때 시간이 오래 걸린다면 아무런 소용이 없을 것이다.
이 문제점을 보안하기 위해 나온 것이 바로 캐시 메모리이다.
캐시 메모리는 저장 장치 계층 구조에서 CPU의 레지스터와 주기억장치 사이에 위치한다.
앞에서 언급했던 것처럼 캐시 메모리는 SRAM을 사용하며, 주기억장치보다 상대적으로 용량이 적고 비용도 비싸다.
캐시 메모리는 L1, L2, L3 캐시 메모리로 나눠진다.
CPU의 코어와 가까운 순서대로 L1 - L2 - L3가 된다.
L1과 L2는 코어 안에 위치하며, L3는 코어 외부에 위치하는 것이 일반적이다.
캐시 메모리의 용량은 L3에 가까울수록 크며, 속도는 L1에 가까울수록 빠르다.
가격도 L1에 가까울수록 비싸다.
CPU가 캐시를 참조하는 순서는 L1 - L2 - L3 순이다.
L3 캐시는 여러 코어가 공유하여 사용할 수 있다는 특징이 있다.
이 구조를 응용한 분리형 캐시라는 구조도 존재한다.
L1 캐시에 접근하는 속도를 조금이라도 높이기 위해 명령어만 저장하는 L1I 캐시, 데이터만 저장하는 L1D 캐시로 분리하는 것이다.
캐시 메모리는 RAM보다 용량이 적다.
이 때문에 캐시 메모리는 RAM의 모든 데이터를 저장할 수 없다.
CPU는 캐시 메모리의 값을 먼저 참조하고, 원하는 값이 없을 경우 RAM을 참조한다.
캐시 메모리는 CPU가 사용할 것이라고 예상되는 값을 미리 저장해 두는 방식을 사용한다.
만약 그 예측이 들어맞을 경우, 이를 캐시 히트라고 부른다.
캐시 히트가 발생하면 당연히 RAM을 참조하지 않고 캐시 메모리만 참조하면 되므로 실행 속도가 빠르다.
하지만 캐시 히트가 항상 발생하는 것은 아니다. 이를 캐시 미스라고 부른다.
캐시 미스가 발생하면 CPU는 RAM을 참조해야 한다.
즉, 캐시 미스가 발생하면 캐시 메모리를 참조한 뒤, RAM을 한 번 더 참조해야 하므로 속도가 더 떨어지게 된다.
캐시 히트가 발생하는 비율은 캐시 적중률이라고 부르며, 아래와 같이 계산한다.
캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)
3.1) 참조 지역성 원리
참조 지역성의 원리는 CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리이다.
- CPU는 최근에 접근한 메모리 공간에 다시 접근하려는 경향이 있다.
- CPU는 이전에 접근한 메모리 공간 근처를 다시 접근하려는 경향이 있다.
- 최근 접근한 메모리 공간에 다시 접근하려는 경향
이는 프로그래밍을 할 때 필수적으로 사용되는 '변수'와 관련이 있다.
변수에 값을 저장해 두면, 언제든지 그 변수에 참조하여 값을 재활용할 수 있다.
즉, 한 번 접근한 메모리 공간(변수가 저장된 공간)에 여러 번 접근하는 것이 된다.
이처럼 최근 접근한 메모리 공간에 다시 접근하려는 경향은 시간 지역성이라고도 부른다.
- 이전에 접근한 메모리 공간 근처를 다시 접근하려는 경향
프로그래밍을 할 때 배열을 선언하거나, 순차적 코드 실행 등의 상황을 떠올리면 된다.
배열은 메모리에 연속적으로 값을 저장하는 방식이므로, 배열에 접근해 데이터를 참조하면 이전에 접근한 메모리 공간 근처를 반복적으로 사용하게 된다.
이처럼 접근한 메모리 공간 근처를 다시 접근하려는 경향을 공간 지역성이라고도 부른다.
수고하셨습니다!
'Dev. Study Note > Computer Architecture' 카테고리의 다른 글
7. 입출력장치 (0) | 2023.03.29 |
---|---|
6. 보조기억장치 (0) | 2023.03.28 |
4. CPU (0) | 2023.03.19 |
3. 명령어 (0) | 2023.03.12 |
2. 데이터 (0) | 2023.03.12 |