RAM의 특징과 종류
RAM의 특징
RAM은 전원을 종료하면 저장된 명령어와 데이터가 모두 날아간다. 이런 특징을 휘발성 저장 장치라고 한다.
반면, 전원을 종료해도 저장된 내용이 유지되는 저장장치를 비휘발성 저장장치라고 한다. HDD, SSD, CD-ROM이 여기에 해당된다.
보조기억장치는 전원을 꺼도 내용을 유지하지만, CPU는 보조기억장치에 직접 접근하지 못한다. 그래서 일반적으로 보조기억장치에는 ‘보관할 대상’을 저장하고, 주기억장치에는 ‘실행할 대상’을 저장한다.
RAM의 용량과 성능
프로그램을 실행하려면 보조기억장치에 있는 프로그램을 RAM으로 가져와야한다. 만약 동시에 여러개의 프로그램을 번갈아가면서 사용해야할 때 RAM의 용량이 작다면 보조기억장치에서 RAM으로 프로그램을 가져오는 횟수가 늘어나게 된다. 따라서 RAM의 용량이 클수록 많은 프로그램을 동시에 실행시킬 때 보조기억장치에서 복사해오는 횟수가 줄어게되고, 결과적으로는 여러개의 프로그램을 동시에 실행시키는 속도가 빨라지게 된다.
하지만 RAM의 용량이 크다고 해서 무조건 속도가 빨라지는 것은 아니다. RAM에 있는 데이터가 CPU까지 전달되는 시간이 있기 때문이다.
RAM의 종류
RAM의 종류는 크게 DRAM, SRAM, SDRAM, DDR SDRAM이 있다.
- DRAM
- Dynamic RAM의 준말로, 저장된 데이터가 동적으로 변하는 RAM을 의미한다. 즉, 시간이 지나면 저장된 데이터가 점차 사라지게 되며, 이를 방지하기 위해서 일정 주기로 데이터를 재활성화(다시 저장)해야 한다. 이런 단점에도 일반적으로 사용하는 메모리는 DRAM인데, 소비 전력이 비교적 낮고, 저렴하며, 집적도가 높기 때문에 대용량으로 설계하기에 용이하기 때문이다.
- SRAM
- Static RAM의 준말로, 저장된 데이터가 변하지 않는 RAM을 의미한다. 따라서 주기적으로 재활성화할 필요가 없으며, 일반적으로 DRAM보다 속도가 빠르다. 다만 재활성화할 필요가 없을 뿐이지, 전원이 공급되지 않으면 저장된 내용이 휘발된다.
- 하지만 이런 장점에도 불구하고 DRAM을 사용하는 이유는 더 비싸고, 집적도가 낮으며, 소비 전력이 크기 때문이다. 그래서 대용량으로 만들어질 필요가 없지만 속도가 발라야 하는 저장장치에 사용된다. 캐시메모리가 여기에 포한될 수 있다.
- SDRAM
- SDRAM은 Synchronous Dynamic RAM의 준말로, 클럭 신호화 동기화된 형태의 DRAM이다. ‘클럭신호와 동기화되었다’라는 말의 의미는 클럭 타이밍에 맞춰 CPU와 정보를 주고받을 수 있음을 의미한다.
Q : 클럭신호와 동기화되지 않는 RAM은 어떤 차이가 있는가?
A : 동기화 되지 않은 RAM은 메모리를 읽어오기 위해서 신호를 보내고, 일정 시간(해당 메모리의 값을 꺼내오는데 까지 걸리는 시간)을 기다렸다가 메모리를 읽어온다. 반면 동기화 되는 RAM은 시간이 아닌 클럭을 기준으로 기다렸다가 메모리를 읽어온다.
(위의 설명보다 훨씬 복잡한 체계가 있지만, 필요이상으로 시간을 잡아먹게 될 것 같아 요약함. 내용이 조금 다를 수 있으니 주의)
Q : 클럭신호로 동기화 했을때 어떤 이점이 있는가?
A : 클럭 단위로 처리하게 될 경우 SDRAM내부에 파이프라인 처리를 할 수 있다. 명령어 파이프라이닝처럼 동작을 클럭 단위로 나눌 수 있게 되면서, 여러개의 행동을 병렬적으로 처리할 수 있게 되었다.
(이보다 조금 더 많은 장점이 있으나, 사전지식이 많아 필요 이상으로 시간을 잡아먹게 될것같아 가장 와닿는 장점을 꼽음.)
- DDR SDRAM
- 최근에 가장 흔히 사용되는 RAM으로, SDRAM의 대역폭을 넓혀 속도를 빠르게 만든 버전이다. 대역폭이란 데이터를 주고받는 길의 너비를 의미한다. 즉 한번에 전송할 수 있는 데이터의 크기가 커지면서, 전송속도가 빨라지게 되었다.
- DDR2 SDRAM은 DDR SDRAM보다 대역폭이 두 배 넓으며, DDR3 SDRAM은 DDR2 SDRAM보다 너비가 두 배 더 넓다.
- 현재에는 DDR5 SDRAM을 사용한다.
메모리의 주소 공간
메모리의 주소는 크게 물리 주소와 논리 주소로 나눌 수 있다. 물리 주소는 메모리 하드웨어가 사용하는 주소이고, 논리 주소는 CPU와 실행중인 프로그램이 사용하는 주소이다.
물리 주소와 논리 주소
- 물리 주소
- 실제로 저장된 하드웨어상의 주소를 의미한다.
- 논리 주소
- CPU와 실행 중인 프로그램이 사용하는 주소로, 실행중인 프로그램 각각에 부여된 0번지부터 시작되는 주소를 의미한다.
예를들어 메모장이라는 프로그램이 실행되었다고 가정해보자. 메모장은 메모리의 1000번째 주소에 생성되어있다. 이때 메모장의 100번째 명령어에 접근하려고 한다. 이 명령어의 주소는 물리 주소로서는 ‘1100번째’라는 주소를 가지고 있고, 논리 주소로서는 ‘100번째’라는 주소를 가지고 있다.
이때 만약 CPU가 메모장 프로그램의 100번째 주소(논리 주소)에 접근하려고 한다. CPU가 메모리에게 ‘100번째 주소에 접근하게 해줘’라고 명령을 보낸다면, 메모리는 물리 주소를 사용하기 때문에 물리주소의 100번째 주소에 접근하려 할 것이다. 이러면 의도치 않은 결과를 초래하기 때문에 물리주소와 논리주소를 서로 변환할 수 있어야한다.
논리 주소와 물리 주소간의 변환은 CPU와 주소 버스 사이에 위치한 메모리 관리 장치(MMU; Memory Management Unit)라는 하드웨어에 의해 수행된다.
MMU는 CPU가 발생시킨 논리 주소에 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다.
베이스 레지스터는 프로그램의 가장 작은 물리 주소, 즉 프로그램의 첫 물리주소를 저장하는 셈이고, 논리 주소는 프로그램의 시작점으로부터 떨어진 거리인 셈이다.
메모리 보호 기법
메모장 프로그램과 인터넷 브라우저가 실행되어있다고 가정하자. 메모장 프로그램은 물리 주소 1000번지부터 1999번지까지 저장되어 있고, 인터넷 브라우저는 물리 주소 2000번지부터 2999번지까지 저장되어있다. 이때 메모장 프로그램 명령어 중 ‘(논리 주소) 1500번지에 숫자 100을 저장하라’라는 명령어가 있다면, 물리주소로는 2500번지가 되므로 인터넷 브라우저의 주소에 침범한 셈이다. 이럴때는 어떻게 될까?
이렇게 다른 프로그램의 영역을 침범할 수 있는 명령어는 위험하기 때문에 논리 주소 범위를 벗어나는 명령어 실행을 방지하고 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요하다. 이는 한계 레지스터라는 레지스터가 담당한다.
한계 레지스터는 논리 주소의 최대 크기를 저장한다. 즉, 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상, 베이스 레지스터값 + 한계 레지스터값 미만이 된다.
CPU는 메모리에 접근하기 전에 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다. 만약 CPU가 한계 레지스터보다 높은 논리 주소에 접근하려고 하면 인터럽트(트랩)을 발생시켜 실행을 중단한다.
이러한 방식으로 다른 프로그램의 메모리에 접근하지 못하도록 보호할 수 있다.
캐시 메모리
CPU는 프로그램을 실행하는 과정에서 메모리에 저장된 데이터를 빈번하게 사용하게 되는데, CPU가 메모리에 접근하는 시간보다 CPU의 연산 시간이 훨씬 빠르다. 이를 극복하기 위한 장치가 캐시 메모리이다.
저장 장치 계층 구조
저장 장치는 일반적으로 아래와 같은 명제를 따른다.
- CPU와 가까운 저장 장치는 바르고, 멀리 있는 저장 장치는 느리다.
- 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다.
대용량 저장 장치를 원한다면 느린 속도를 감수해야 하고, 빠른 메모리를 원한다면 작은 용량과 비싼 가격을 감수해야한다. 저장 장치는 종류마다 장단점이 명확한데, 어느 하나의 장치만을 사용할 수 는 없다. 일반적인 컴퓨터는 다양한 저장 장치를 모두 사용한다.
저장 장치들은 CPU에 얼마나 가까운가를 기준으로 계층적으로 나타낼 수 있다. 이를 저장 장치 계층 구조라고 한다.
캐시 메모리
CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 느리다. 그럼에도 CPU는 프로그램을 실행하는 과정에서 메모리에 빈번히 접근해야 한다. CPU가 연산이 아무리 빨라도 메모리에 접근하는 속도가 느리다면 소용이 없다. 이런 문제를 해결하기 위해 등장한 저장장치가 캐시 메모리이다.
캐시 메모리는 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 활용한다. 만약 CPU가 특정 주소에 접근하여 데이터를 가져오고 싶은데, 그 데이터가 이미 캐시 메모리에 있다면 굳이 메모리에 접근할 필요 없이 바르게 데이터를 가져올 수 있다.
캐시 메모리는 코어게 가까운 순서대로 계층을 구성한다. 코어와 가장 가까운 캐시 메모리를 L1 캐시, 그 다음 가까운 캐시 메모리를 L2캐시, 그 다음 가까운 캐시 메모리를 L3캐시라고 부른다.
일반적으로 L1, L2 캐시는 코어 내부에, L3 캐시는 코어 외부에 위치해 있다.
저장 속도는 L1에 가까울수록 빠르며, 저장 용량은 L3에 가까울수록 크다. CPU가 메모리 내에 데이터가 필요하다면 L1, L2, L3순으로 데이터가 있는지 알아본다.
코어와 가장 가까운 L1캐시는 조금이라도 접근 속도를 빠르게 만들기 위해 명령어 만을 저장하는 L1캐시인 L1I 캐시와 데이터만을 저장하는 L1 캐시인 L1D 캐시로 분리하는 경우도 있다. 이를 분리형 캐시(split cache)라고 한다.
참조 지역성 원리
CPU가 필요한 데이터가 캐시 메모리에 있어서 즉시 데이터를 획득한 것을 캐시 히트라고 하고, 반대로 캐시 메모리에 원하는 데이터가 없어서 메모리까지 접근한 경우를 캐시 미스라고한다. 캐시 미스가 자주 발생할수록 성능이 떨어지게 된다. 캐시 메모리의 이점을 활용하기 위해선 캐시 적중률이 높아야한다.
캐시 메모리는 한 가지 원칙에 따라 메모리로부터 가져올 데이터를 결정한다. 바로 참조 지역성의 원리(locality of reference, principle of locality)이다. 참조 지역성의 원리란 CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리이다.
- CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.
- 반복문 같은 경우 i 와 같은 임시 변수를 생성하는 경우가 많은데, 일반적으로 이 변수는 매번 반복할때마다 접근하게 된다. 따라서 이런 경우가 ‘최근에 접근했던 메모리 공간에 접근하려는 경향’이며, 이것을 시간 지역성(temporal locality)이라고 한다.
- CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다.
- CPU가 실행하려는 프로그램은 보통 관련 데이터들끼리 모여있다. 예를들어 어떤 배열에 있는 요소들을 하나하나 접근해야하는 경우, 배열내의 요소들은 뭉쳐있기 때문에 접근한 메모리 공간 근처를 접근하게된다. 이처럼 ‘접근한 메모리 공간 근처를 접근하려는 경향’을 공간 지역성(spatial locality)이라고 한다.
'도서 정리 > 혼자 공부하는 컴퓨터 구조 + 운영체제' 카테고리의 다른 글
[혼자 공부하는 컴퓨터 구조 + 운영체제] 8강 입출력장치 (0) | 2025.01.19 |
---|---|
[혼자 공부하는 컴퓨터 구조 + 운영체제] 7강 보조기억장치 (0) | 2025.01.19 |
[혼자 공부하는 컴퓨터 구조 + 운영체제] 5강 CPU 성능 향상 기법 (0) | 2025.01.14 |
[혼자 공부하는 컴퓨터 구조 + 운영체제] 4강 CPU의 작동원리 (0) | 2025.01.12 |
[혼자 공부하는 컴퓨터 구조 + 운영체제] 3강 명령어 (0) | 2025.01.11 |