RAM에는 실행할 프로그램의 명령어와 데이터가 저장이 된다.
여기서 RAM은 전원을 차단하면 저장된 내용이 사라지는데 이를 휘발성 memory라고 한다.
반면 전원을 차단해도 내용이 유지되는 저장 장치들을 비휘발성 memory라고 부른다.
여기에는 hard disk, SSD, USB와 같은 보조기억장치들이 있다.
CPU는 일반적으로 memory에만 직접 접근할 수 있고 보조기억장치에는 직접 접근할 수 없다.
이 때문에 보조기억장치에는 보관할 대상을 저장하도록 하고 RAM 등 휘발성 memory에 실행할 대상을 저장한다.
만약 보관한 데이터 중 CPU가 실행하고 싶은 데이터가 있다면 disk에서 RAM으로 복제한 뒤 이를 실행한다.
CPU는 실행하고 싶은 프로그램이 disk에 있을 때 이를 RAM으로 가져오는데, RAM이 적다면 disk에서 program을 가져오는 일이 잦아 overhead가 발생한다.
만약 RAM이 충분히 크다면 disk에 접근하는 횟수가 줄어들고 이에 대해서 이득을 볼 수 있다.
하지만 RAM 용량과 프로그램의 실행 속도가 항상 비례하는 것은 아닌게, 메모리에 접근하는 속도는 일정하기 때문에 어느정도 크기가 커진다면 그 이후에는 속도가 더 빨라지지 않는다.
RAM은 크게 아래의 종류로 구분할 수 있다.
DRAM
Dynamic RAM의 줄임말이다.
저장된 데이터가 동적으로 변하는 RAM을 의미하며 이는 시간이 지나면 저장된 데이터가 점차 사라지는 형태의 memory라고 볼 수 있다.
DRAM은 이러한 데이터의 소멸을 막기위해 일정 주기로 데이터를 다시 저장하는 재활성화를 한다.
일반적으로 사용하는 memory가 이 memory인데 이는 소비 전력이 비교적 낮고 저렴하며 집적도가 높아 대용량으로 설계하기 용이하기 때문이다.
SRAM
Static RAM의 줄임말이다.
저장된 데이터가 변하지 않는 RAM을 의미하며 시간이 지나도 저장된 데이터가 사라지지 않는다.
주기적으로 재활성화를 할 필요도 없으며 DRAM보다 일반적으로 속도도 더 빠르다고 할 수 있다.
하지만 집적도가 낮고 소비 전력이 크며 가격이 더 비싸기 때문에 '대용량으로 만들 필요는 없지만 속도가 빨라야 하는 저장 장치'에서 주로 사용한다.
예를 들면 캐시 등이 있다.
SDRAM
Synchronous Dynamic RAM으로 clock과 동기화된, 발전된 형태의 DRAM이다.
clock과 동기화 되었다는 것은 곧 clock에 맞춰 CPU와 데이터를 주고 받는다는 것을 말한다.
DDR SDRAM
최근 많이 사용하는 RAM이며 SDRAM의 대역폭을 넓혀 속도를 빠르게 만든 RAM이다.
여기서 대역폭이란 한번에 주고받는 데이터량의 크기라고 생각하면 좋다.
즉 DDR2 SDRAM은 SDRAM에 비해서 대역폭이 2배 넓은 SDRAM이며 DDR 뒤의 숫자는 2의 제곱수를 의미한다.
최근에 흔하게 사용하는 DDR4 SDRAM은 2^4인 대역폭이 16배 넓다고 할 수있다.
Memory에 저장된 정보의 위치를 나타내는 방법은 주소라고 하는데, 이 주소는 물리 주소와 논리 주소 2가지가 있다.
메모리가 사용하는 물리 주소는 말 그대로 정보가 실제로 저장된 하드웨어 상의 주소를 의미하고 CPU와 실행 중인 프로그램이 사용하는 주소는 논리 주소라고 하며 실행 중인 프로그램 각각에 부여된 0부터 시작되는 주소를 의미한다.
이 논리 주소와 물리 주소를 변환해주는 장치는 CPU와 address bus 사이에 위치하는 MMU(Memory Management Unit)라는 하드웨어가 담당하는데, MMU는 CPU가 발생시킨 논리 주소에 base register 값을 더하여 논리 주소를 물리 주소로 변환한다.
base register는 프로그램의 첫 물리 주소를 저장하고, 논리 주소는 base register로 부터 떨어진 거리를 의미하는 셈이라고 볼 수 있다.
프로그램의 논리 주소 영역을 벗어나는 등의 다른 프로그램의 영역을 침범하는 명령어는 위험하기 때문에 명령어 실행을 방지하고 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호하는 장치가 limit register이다.
limit register는 실행 중인 프로그램이 가지는 논리 주소의 최대 크기를 저장하도록 한다.
즉 물리 주소 범위는 base register 보다 크면서 base register + limit register 미만이 된다.
이러한 방식으로 프로그램 간 독립적인 실행 공간을 확보하고 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호하도록 한다.