6장 : 메모리 계층 구조
지금까지 시스템에 대한 공부는 CPU가 명령어를 실행하고, 메모리 시스템이 명령어와 데이터를 저장하는 간단한 모델에 기반하였다. 이 모델은 어느 정도 유용하지만 실제 현대 시스템의 동작 방식을 정확히 반영하지 않는다.
실제로 메모리 시스템은 다양한 용량, 비용, 접근 시간을 가진 저장 장치들이 계층적으로 조직된 형태를 가진다. CPU 레지스터는 가장 자주 사용하는 데이터를 저장하며, CPU 근처의 작은 고속 캐시 메모리는 주 메모리에 저장된 데이터와 명령어의 일부를 임시로 보관하는 역할을 한다. 주 메모리는 느리고 큰 디스크로부터 데이터를 가져온다. 이 디스크들은 다시 다른 컴퓨터에 연결된 디스크나 테이프에 저장된 데이터를 가져온다.
메모리 계층이 효과적인 이유는, 잘 작성된 프로그램들이 특정 레벨의 저장소를 그 아래 레벨보다 훨씬 자주 접근하는 경향을 보이기 때문이다. 덕분에 하위 저장소는 더 느리고 싸게 만들어도 되고, 상위 저장소는 빠르고 비싸지만 용량이 적어도 된다.
프로그래머는 메모리 계층을 이해해야 한다. 프로그램이 데이터를 CPU 레지스터에 저장하면 접근 시간은 0 사이클이다. 캐시에 저장된 경우는 4~75 사이클, 주 메모리에 저장된 경우 수백 사이클, 디스크에 저장된 경우 수천만 사이클이 걸린다.
이 장에서는 기본 저장 기술들—SRAM, DRAM, ROM, 회전 디스크, SSD—을 살펴보고, 이들이 어떻게 계층 구조로 조직되는지 설명한다. 특히 CPU와 주 메모리 사이의 중간 단계인 캐시 메모리에 집중하며, 프로그램에서 지역성(locality)을 분석하고 향상시키는 방법을 소개한다.
6.1 Storage Technologies (저장 기술)
컴퓨터 기술의 성공은 저장 기술의 급격한 발전 덕분이다. 초기 컴퓨터는 수 킬로바이트의 RAM만 가졌으며, 초기 IBM PC는 하드 디스크조차 없었다. 1982년에 IBM PC-XT가 10MB 디스크를 장착하면서 상황이 바뀌었고, 2015년 기준으로 일반적인 컴퓨터는 디스크 저장 용량이 30만 배나 증가했다. 저장 용량은 매 2년마다 2배씩 증가하고 있다.
6.1.1 Random Access Memory (RAM)
RAM은 정적 RAM(SRAM)과 동적 RAM(DRAM) 두 가지 형태가 있다. SRAM은 빠르지만 DRAM보다 훨씬 비싸다. SRAM은 CPU 내부 및 외부의 캐시 메모리에 사용되고, DRAM은 주 메모리와 그래픽 시스템의 프레임 버퍼에 사용된다. 일반 데스크탑 시스템은 수십 메가바이트의 SRAM과 수백~수천 메가바이트의 DRAM을 가진다.
- Static RAM (SRAM)
SRAM은 각 비트를 이진 안정 상태를 갖는 메모리 셀에 저장한다. 각 셀은 여섯 개의 트랜지스터로 구성된 회로로 구현된다. 이 회로는 두 개의 안정된 전압 상태 중 하나를 무한히 유지할 수 있으며, 불안정한 상태로부터는 빠르게 안정된 상태로 돌아간다. 이 구조는 좌우로 기울어진 상태에서 안정되고 수직 상태에서는 불안정한 "역진자(inverted pendulum)"와 비슷하다. 전원이 공급되는 한, SRAM 셀은 저장된 값을 무한히 유지할 수 있다. - Dynamic RAM (DRAM)
DRAM은 각 비트를 축전지에 저장한다. 이 축전지는 매우 작으며 외부 간섭(빛, 전기 노이즈 등)에 민감하다. 축전지는 시간이 지나면서 누설 전류로 인해 충전 상태를 잃기 때문에, 메모리 시스템은 주기적으로 메모리를 읽고 다시 써서(refresh) 데이터를 유지해야 한다. DRAM은 집적도가 높고 비용이 저렴하지만, 주기적인 리프레시가 필요하고, SRAM에 비해 접근 시간이 느리다.
메모리 모듈 (Memory Modules)
메인 메모리는 여러 개의 메모리 모듈로 구성된다. 메모리 컨트롤러는 주어진 메모리 주소 A를 받아, 적절한 모듈을 선택하고, 그 모듈에 대해 (i, j) 형태의 슈퍼셀 주소로 변환하여 데이터를 요청한다. 각 DRAM은 자신의 (i, j) 슈퍼셀의 8비트 데이터를 출력하고, 모듈 내 회로가 이 데이터를 모아 64비트 단어로 조합하여 CPU로 전송한다.
향상된 DRAM (Enhanced DRAMs)
DRAM의 다양한 종류가 등장하고 있다. 모두 기본 DRAM 셀을 기반으로 하면서 접근 속도를 개선한 것들이다.
- FPM DRAM (Fast Page Mode DRAM)
일반 DRAM은 한 행 전체를 로우 버퍼로 복사한 뒤 필요 없는 데이터를 버린다. FPM DRAM은 같은 행을 연속으로 접근할 때 로우 버퍼에서 직접 데이터를 제공하여 접근 속도를 높인다. - EDO DRAM (Extended Data Out DRAM)
FPM DRAM을 개선한 형태로, CAS 신호를 더 빠르게 연속적으로 보낼 수 있다. - SDRAM (Synchronous DRAM)
기존 DRAM과 달리, 외부 클럭 신호에 동기화되어 동작하여 데이터 전송 속도를 높인다. - DDR SDRAM (Double Data-Rate SDRAM)
SDRAM의 속도를 두 배로 높인 형태로, 클럭의 상승과 하강 에지를 모두 활용하여 데이터를 전송한다. DDR, DDR2, DDR3는 각각 2, 4, 8비트 프리페치 버퍼를 가진다. - VRAM (Video RAM)
그래픽 시스템 프레임 버퍼용으로 설계된 DRAM으로, 한 번에 버퍼 전체를 시프트하여 읽고, 동시에 읽기와 쓰기가 가능한 구조를 가진다.
비휘발성 메모리 (Nonvolatile Memories)
SRAM과 DRAM은 전원이 끊기면 데이터가 사라진다. 반면, 비휘발성 메모리는 전원이 꺼져도 데이터를 유지한다. 일반적으로 "ROM"이라 불리며, 재프로그래밍 가능 여부에 따라 여러 형태가 있다.
- PROM (Programmable ROM): 한 번만 프로그래밍 가능
- EPROM (Erasable PROM): 자외선을 통해 데이터를 지우고 다시 쓸 수 있음
- EEPROM (Electrically Erasable PROM): 전기적으로 다시 쓸 수 있으며, 최대 10만 번까지 재기록 가능
- 플래시 메모리 (Flash Memory): EEPROM을 기반으로 하며, 빠르고 내구성 있는 저장 수단으로 디지털 카메라, 휴대폰, SSD 등에 널리 사용된다.
ROM에 저장된 프로그램은 종종 펌웨어(firmware)라 불리며, 시스템 부팅 시 펌웨어를 실행한다.
메인 메모리 접근하기 (Accessing Main Memory)
CPU와 DRAM 주메모리 간 데이터 흐름은 공유 전기 경로인 버스(bus)를 통해 이루어진다. 하나의 데이터 이동은 버스 트랜잭션이라 불리며, 읽기 트랜잭션은 메모리에서 CPU로 데이터를 전송하고, 쓰기 트랜잭션은 CPU에서 메모리로 데이터를 보낸다.
버스는 주소, 데이터, 제어 신호를 전송하는 병렬 와이어 집합이다. 시스템 버스는 CPU와 I/O 브리지를 연결하고, 메모리 버스는 I/O 브리지와 메모리를 연결한다.
6.1.2 디스크 저장장치 (Disk Storage)
디스크는 대용량 데이터를 저장하는 기본 저장장치다. 수백 기가바이트에서 수 테라바이트까지 저장 가능하지만, 읽기 속도는 RAM보다 훨씬 느리다. 디스크에서 정보를 읽는 데는 수 밀리초(ms)가 걸리는데, 이는 DRAM보다 약 10만 배, SRAM보다 약 백만 배 더 느리다.
디스크 구조 (Disk Geometry)
디스크는 하나 이상의 플래터(platter)로 구성된다. 플래터는 양면이 자기 기록 물질로 덮여 있으며, 중앙의 스핀들이 고정 속도로 회전시킨다. 회전 속도는 보통 5,400RPM에서 15,000RPM 사이이다. 디스크 하나에는 여러 개의 플래터가 쌓여 있으며, 이 전체를 디스크 드라이브라 부른다.
플래터 표면은 여러 개의 동심 원형 트랙(track)으로 나뉘며, 트랙은 다시 여러 섹터(sector)로 나뉜다. 각 섹터는 일반적으로 512바이트 크기의 데이터를 저장한다. 섹터와 섹터 사이에는 데이터를 식별하기 위한 포맷팅 비트가 저장된 간격(gap)이 존재한다.
논리 디스크 블록 (Logical Disk Blocks)
실제 디스크의 복잡한 구조를 숨기기 위해, 운영체제에는 디스크를 일련의 **논리 블록(logical blocks)**으로 단순하게 나타낸다. 논리 블록 번호는 0, 1, 2, … 순서로 매겨진다.
운영체제가 특정 논리 블록을 읽으라고 요청하면, 디스크 컨트롤러가 논리 블록 번호를 물리적 주소(플래터 번호, 트랙 번호, 섹터 번호)로 변환한다. 이후 읽기 작업이 수행되어 데이터를 메모리로 전달한다.
디스크 용량 (Disk Capacity)
디스크는 플래터, 트랙, 섹터의 구조를 가진다. 디스크의 저장 용량은 다음 요소에 의해 결정된다:
- 각 섹터의 바이트 수 (보통 512바이트)
- 트랙당 섹터 수
- 플래터당 트랙 수
- 플래터 수
이 값들을 곱하여 총 디스크 용량을 계산할 수 있다. 예를 들어, 5장의 플래터에 각 면마다 1000개의 트랙, 각 트랙당 400섹터, 각 섹터당 512바이트라면 전체 용량은 수백 기가바이트에 달한다.
디스크의 동작 (Disk Operation)
디스크에서 데이터를 읽거나 쓸 때는 세 가지 주요 단계가 필요하다:
- 탐색(seek): 읽고자 하는 트랙으로 디스크 헤드를 이동한다.
- 회전 지연(rotational latency): 디스크가 회전하여 원하는 섹터가 헤드 아래로 올 때까지 기다린다.
- 전송(transfer): 원하는 데이터를 메모리로 전송한다.
탐색 시간과 회전 지연이 디스크 접근 시간의 대부분을 차지하며, 실제 데이터 전송 시간은 상대적으로 매우 짧다.
논리적 디스크 블록 (Logical Disk Blocks)
디스크는 운영체제에 의해 논리 블록 번호 0, 1, 2, …와 같은 연속적인 번호로 추상화된다. 운영체제는 블록 번호만 신경 쓰고, 디스크 컨트롤러가 이 논리 번호를 실제 물리적 주소(플래터, 트랙, 섹터)로 변환하여 접근한다. 이를 통해 운영체제는 디스크 하드웨어의 복잡한 세부 사항을 신경 쓸 필요 없이 일관된 방법으로 데이터를 저장하고 읽을 수 있다.
입출력 장치 연결하기 (Connecting I/O Devices)
디스크 같은 I/O 장치는 시스템 버스를 통해 CPU와 연결된다. 구체적으로는 I/O 브리지를 통해 CPU와 메모리, 디스크 같은 I/O 장치가 연결된다. I/O 브리지는 시스템 버스와 메모리 버스, 그리고 I/O 버스를 중개하며, CPU가 디스크에 접근할 때 신호를 전달하고 데이터를 중개한다.
디스크 접근하기 (Accessing Disk)
디스크에서 데이터를 읽는 과정은 다음과 같다:
- CPU는 논리 블록 번호를 디스크 컨트롤러에 요청한다.
- 컨트롤러는 논리 블록 번호를 물리적 주소로 변환한다.
- 디스크는 탐색, 회전, 전송 과정을 거쳐 데이터를 읽어온다.
- 데이터는 시스템 버스를 통해 CPU로 전달된다.
효율적인 디스크 접근을 위해 운영체제는 디스크 요청을 재정렬하거나 버퍼 캐싱 같은 최적화를 적용하기도 한다.
6.1.3 솔리드 스테이트 디스크 (Solid State Disks, SSD)
솔리드 스테이트 디스크(SSD)는 플래시 메모리를 기반으로 한 저장장치로, 특정 상황에서는 기존 회전 디스크보다 매력적인 대안이 된다. SSD는 표준 디스크 슬롯(USB, SATA 등)에 연결할 수 있으며, CPU로부터 논리 디스크 블록을 읽고 쓰는 요청을 받아 처리한다.
SSD는 다음 두 가지로 구성된다:
- 플래시 메모리 칩: 기존 회전 디스크의 기계적 부품을 대체한다.
- 플래시 변환 계층(Flash Translation Layer, FTL): 논리 블록 요청을 실제 플래시 메모리 접근으로 변환하는 하드웨어/펌웨어 장치다.
플래시 메모리 구조
플래시 메모리는 여러 개의 블록(block)으로 구성되며, 각 블록은 여러 페이지(page)로 이루어진다. 보통 페이지 크기는 512바이트4KB이며, 하나의 블록은 32128개의 페이지를 가진다. 따라서 블록 전체 크기는 16KB에서 512KB 사이가 된다.
- 데이터는 페이지 단위로 읽고 쓴다.
- 페이지 쓰기 제약: 블록에 속한 모든 페이지를 쓰기 전에, 해당 블록을 완전히 지워야 한다(모든 비트를 1로 초기화).
- 블록은 약 10만 번 쓰기 후 마모된다. 마모된 블록은 더 이상 사용할 수 없다.
성능 특성
상업용 SSD는 다음과 같은 성능을 가진다:
항목 | 성능 |
순차 읽기 처리량 | 550 MB/s |
순차 쓰기 처리량 | 470 MB/s |
랜덤 읽기 처리량 (IOPS) | 89,000 |
랜덤 쓰기 처리량 (IOPS) | 74,000 |
평균 순차 읽기 접근 시간 | 50 μs |
평균 순차 쓰기 접근 시간 | 60 μs |
- SSD는 읽기 속도가 쓰기 속도보다 빠르다.
- 랜덤 쓰기가 느린 이유는 블록 지우기 작업이 느리고, 기존 데이터가 있는 페이지를 덮어쓸 때 다른 페이지를 복사해야 하기 때문이다.
SSD의 장점과 단점
장점:
- 기계 부품이 없어 고장이 적고 내구성이 뛰어나다.
- 랜덤 접근 시간이 매우 빠르다.
- 소비 전력이 낮다.
단점:
- 플래시 블록이 반복 쓰기에 의해 마모된다. 하지만 플래시 변환 계층의 웨어 레벨링(wear leveling) 덕분에 수명이 크게 연장된다.
- 저장 용량 대비 가격이 회전 디스크에 비해 약 30배 비싸다. 그러나 가격은 빠르게 하락하고 있다.
6.1.4 저장 기술 동향 (Storage Technology Trends)
저장 기술을 다룬 논의에서 기억해야 할 중요한 사실들이 있다.
저장 기술 간 가격 및 성능 차이
- 서로 다른 저장 기술은 가격과 성능 면에서 명확한 트레이드오프가 존재한다.
- SRAM은 DRAM보다 빠르고, DRAM은 디스크보다 훨씬 빠르다.
- 그러나 빠른 저장장치는 느린 저장장치보다 항상 비싸다.
- SRAM은 DRAM보다 바이트당 더 비싸고,
- DRAM은 디스크보다 훨씬 비싸다.
- SSD는 DRAM과 회전 디스크 사이의 중간적인 성능과 가격을 가진다.
저장 기술의 가격 및 성능 변화 속도
- 다양한 저장 기술은 시간에 따라 가격과 성능이 서로 다른 속도로 변해왔다.
- 1985년 이후 저장 기술들의 트렌드를 요약하면 다음과 같다:
- SRAM: 접근 시간과 비용 모두 약 100배 향상
- DRAM: 비용은 44,000배 감소했지만, 접근 시간은 10배만 개선
- 디스크: 저장 비용은 3,000,000배 감소했지만, 접근 시간은 겨우 25배 개선.
- 결론적으로, 저장장치는 밀도(density)를 높이는 것은 상대적으로 쉽지만, 접근 시간을 줄이는 것은 매우 어렵다.
CPU와 메모리/디스크 성능 격차
- CPU 성능은 매우 빠르게 발전해왔다.
- 1985년부터 2010년 사이에 CPU 사이클 타임은 500배 개선되었다.
- 다중 코어를 고려하면, 실질적인 개선폭은 2,000배에 이른다.
- 반면 DRAM과 디스크의 접근 속도는 이에 비해 훨씬 느리게 개선되어, CPU와 메모리/디스크 사이 성능 격차가 점점 더 커지고 있다.
결론
- 고속 저장장치는 비용이 비싸고 용량이 적은 경향이 있으며,
- 저속 저장장치는 비용이 저렴하고 용량이 크다.
- 이러한 저장장치 특성을 이용하여 시스템은 메모리 계층구조(memory hierarchy)를 구성하며, 이 구조를 통해 프로그램 성능을 최대한 끌어올린다.
- 이후 장에서는 프로그램이 메모리 계층구조를 얼마나 잘 활용하는지(지역성, locality)를 다루게 된다.
'크래프톤 정글 (컴퓨터 시스템: CSAPP) > 6장 메모리 계층구조' 카테고리의 다른 글
컴퓨터 시스템 : CSAPP 6장 정리 - 종합: 프로그램 성능에 대한 캐시의 영향 (2) | 2025.04.28 |
---|---|
컴퓨터 시스템 : CSAPP 6장 정리 - 6.5 캐시 친화적 코드 작성 (0) | 2025.04.28 |
컴퓨터 시스템 : CSAPP 6장 정리 - 6.4 캐시 메모리 (0) | 2025.04.28 |
컴퓨터 시스템 : CSAPP 6장 정리 - 6.3 메모리 계층 구조 (0) | 2025.04.28 |
컴퓨터 시스템 : CSAPP 6장 정리 - 6.2 지역성 (0) | 2025.04.28 |