주기억장치의 종류에는 크게 RAM과 ROM 두 가지가 있고, '메모리'라는 용어는 그 중 RAM을 지칭하는 경우가 많음
CPU는 메모리(RAM)으로 부터 명령어와 데이터를 가져와 실행
RAM은 전원이 꺼지면 데이터가 날아가는 휘발성 저장 장치이기 때문에 실행할 대상을 저장
보조기억장치에는 전원이 꺼져도 저장되어야 하는 보관할 대상을 저장
RAM이 크면 뭐가 좋을까?
RAM이 CPU와 상호작용 할 때, 크기가 작으면 필요한 프로그램이 있을 때마다 보조기억장치에서 복사해와서 사용해야 하기 때문에 성능이 저하됨
반대로, RAM이 크면 바로바로 CPU와 상호작용 할 수 있으므로 성능이 좋아짐(동시에 여러 개의 프로그램을 실행하는데 유리)
이는 큰 책상과 작은 책상으로 비유할 수 있음
RAM의 종류
DRAM(Dynamic RAM)
Dynamic = 동적의
저장된 데이터가 동적으로 사라지는 RAM
데이터 소멸을 막기 위해 주기적으로 재활성화(리프레시) 필요
즉, 전원이 연결되어 있어도 저장된 데이터가 점점 사라지므로 소멸을 막기 위해 주기적으로 재활성화 필요
일반적으로 메모리로 사용되는 RAM (DRAM 혹은 더 발전된 형태의 DRAM을 주로 사용)
상대적으로 소비전력이 낮고, 저렴하며, 집적도가 높아(오밀조밀하게 설계 가능) 대용량으로 설계하기 용이
SRAM
Static = 정적의
저장된 데이터가 정적인 (사라지지 않는) RAM
물론, 전원이 꺼지면 데이터는 사라짐(휘발성)
DRAM보다 일반적으로 입출력 속도가 더 빠름
하지만 상대적으로 소비전력이 높고, 가격이 비싸며, 집적도가 낮아 대용량으로 설계할 필요는 없으나 빨라야 하는 장치에 사용함
일반적으로 캐시 메모리에서 사용되는 RAM
DRAM vs SRAM
재충전 = 재활성화 = 리프레시
SDRAM (Synchronous DRAM)
특별한 (발전된 형태의) DRAM
클럭 신호와 동기화된 DRAM (클럭신호에 맞춰 한 번에 하나씩 데이터를 주고받을 수 있는 형태)
DDR SDRAM (Double Data Rate SDRAM)
특별한 (발전된 형태의) SDRAM
최근 가장 대중적으로 사용하는 RAM : 특히 DDR4 SDRAM
대역폭을 넓혀 속도를 빠르게 만든 SDRAM
대역폭은 데이터를 주고 받는 길의 너비
SDRAM(single Data Rate SDRAM) vs DDR SDRAM
DDR3는 8개, DDR4는 16개의 길이 있다
메모리의 주소 공간 ★
메모리 내의 주소 체계는 크게 2가지, "논리주소"와 "물리주소"가 있음
CPU와 실행 중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 다 알 수 있을까? NO
CPU와 실행 중인 프로그램은 메모리 몇 번지에 무엇이 저장되어 있는지 다 알지 못함
메모리에 저장된 값들은 시시각각 변하기 때문
새롭게 실행되는 프로그램은 새롭게 메모리에 적재
실행이 끝난 프로그램은 메모리에서 삭제
같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소는 달라짐
그러므로 이러한 한계를 극복하기 위해 논리주소와 물리주소로 나뉨
논리 주소는 0번지가 여러개
물리 주소
메모리 입장에서 바라본 주소
말 그대로 정보가 실제로 저장된 하드웨어상의 주소
주소 번지의 중복 X
논리 주소
CPU와 실행 중인 프로그램 입장에서 바라본 주소
실행 중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소
같은 주소 번지가 중복될 수 있음
물리 주소와 논리 주소의 변환
CPU와 메모리의 상호작용을 위해선 변환이 필수
MMU
MMU(메모리 관리 장치, Memory Management Unit)
논리주소 ↔ 물리주소 변환
CPU와 메모리가 주소 버스를 통해 주소를 주고 받을 땐 항상 MMU를 거침
MMU는 논리 주소와 베이스 레지스터값을 더하여 논리 주소를 물리 주소로 변환
베이스 레지스터 - 프로그램의 기준 주소 값, 즉 물리 주소 상의 프로그램의 시작 주소가 담김 - 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장하는 셈
논리 주소 - 실제로 저장되어있는 그 프로그램으로부터 얼마나 떨어져 있느냐에 대한 정보 - 즉, 프로그램의 시작점으로부터 떨어진 거리
문제점
다른 프로그램의 영역을 침범하는 명령어를 실행 할 수 있음
1000 + 1500 = 2500번지이므로, 인터넷 브라우저 데이터 부분이 손상
게임 데이터 부분 손상
메모리 보호
한계 레지스터
프로그램의 영역을 침범할 수 있는 명령어의 실행을 막음
베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장
베이스 레지스터 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값
CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안 됨
이처럼 CPU는 메모리에 접근하기 전 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사
실행 중인 프로그램의 독립적인 실행 공간을 확보 & 하나의 프로그램이 다른 프로그램을 침범하지 못하도록 보호
캐시 메모리
필요성
CPU가 메모리에 접근하는 시간은 CPU 연산 속도보다 느리다
저장장치 계층구조
레지스터 vs 메모리(RAM) vs USB 메모리
CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다
속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다
이렇게 각각의 저장 장치들의 장단점이 명확하기 때문에 한가지만 쓰기보다는 장단점에 맞게 잘 배치해서 계층적으로 사용함
캐시메모리
CPU와 메모리 사이에 위치한, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장 장치
CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생
CPU가 매번 메모리에 왔다 갔다 하는 건 시간이 오래 걸리니, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 쓰자!
캐시메모리를 사용할 경우가 성능상 더 좋음
캐시메모리를 반영한 저장 장치 계층 구조
캐시메모리는 CPU의 연산 속도와 메모리 접근 속도의 차이를 줄이기 위한 저장 장치
계층적 캐시 메모리
캐시 메모리는 CPU 내부에 있을 수 있고 외부에 있을 수도 있음
현대 CPU 캐시 메모리 설계에서 가장 일반적인 설계 방식
L1 캐시는 L2보다 용량은 작지만 더 빠름
L2는 L3캐시 보다 용량은 작지만 더 빠름
L3 캐시는 메모리보다 용량은 작지만 빠르고, L1,L2보단 용량이 크지만 느림
멀티코어 프로세서의 캐시 메모리
코어마다 따로 캐시를 가지고 있고, L3는 공유하는 형태로 사용하기도 함
참고) 코어마다 L1 캐시, L2 캐시를 따로 두기 때문에 각각의 코어에 있는 각각의 캐시 메모리들이 서로 다른 내용을 저장하게 될 수 있음. 즉, 데이터의 일관성이 깨질 수 있음. 그렇기 때문에 멀티코어 프로세서에서는 캐시 메모리가 모두 동일한 내용을 갖게끔 싱크를 맞춰주는 것이 아주 중요한 문제임
분리형 캐시
L1 캐시를 조금이라도 더 빠르게 만들기 위해 데이터 캐시인 L1D, 명령어 캐시인 L1I(instruction)으로 나누기도 함
계층적 캐시 메모리까지 반영한 저장 장치 계층 구조
참조 지역성의 원리
CPU가 사용할 법한 데이터를 예측하는 방법을 "참조 지역성의 원리"라고 함
캐시 메모리는 메모리보다 용량이 작기 때문에 메모리의 모든 내용을 저장할 수 없음
그러므로 CPU가 자주 사용할 법한 내용을 예측하여 저장함
캐시 히트 : 예측이 맞을 경우 (CPU가 캐시 메모리에 저장된 값을 활용할 경우)
캐시 미스 : 예측이 틀린 경우 (CPU가 메모리에 접근해야 하는 경우)
캐시 적중률 = 캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)
캐시 적중률이 높을수록 성능이 좋음(일반적으로 80% 이상은 됨)
캐시 히트(좌) / 캐시 미스(우)
참조 지역성의 원리는 CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 캐시 적중률을 높이기 위해 만들어진 원리
CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다num이라는 주소 공간에 계속 접근하는 모습
CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다(공간 지역성)
- CPU가 실행하려는 프로그램은 보통 관련된 데이터들끼리 한 곳에 모여있는 경우가 많음 - 위의 경우에도 워드 프로세서의 관련된 기능들끼리 모여서 저장되어 있음 - 예를 들어 입력 기능을 사용할 때에는 입력 기능 근처를 자주 참조