儲存技術 (Storage Technologies)

Overview Table

主題 核心概念 關鍵數字/公式 書頁
SRAM 雙穩態 (bistable) 6 電晶體 cell,不需 refresh 存取約 1×,成本約 1,000×,用於 cache p.617-618
DRAM 電容儲存電荷,1 電晶體 + 1 電容,需 refresh 存取約 10×,成本 1×,retention 10-100 ms p.618
Conventional DRAM d 個 supercell(每個 w bits)排成 r×c 陣列;RAS/CAS 兩步定址 d×w DRAM 存 dw bits,rc = d p.618-619
Memory module DIMM 一次傳 64-bit;8 顆 8M×8 DRAM 各出 1 byte 組成一個 word 240-pin DIMM p.620
Enhanced DRAM FPM / EDO / SDRAM / DDR / VRAM,皆優化列緩衝或時脈利用 DDR prefetch:DDR=2、DDR2=4、DDR3=8 bits p.621-622
Nonvolatile (ROM) PROM(1 次)、EPROM(~1,000 次)、EEPROM(~10^5 次)、Flash firmware / BIOS 存於 ROM p.622-623
Bus transaction CPU ↔ I/O bridge ↔ 主記憶體;read/write 各三步驟 system bus + memory bus p.623-625
Disk geometry platter → surface → track → sector;cylinder = 等距 track 集合 sector 通常 512 bytes p.625-627
Disk capacity 容量公式五因子連乘;multiple zone recording 提升密度 見下方公式 p.627-628
Disk access time seek + rotational latency + transfer,前兩者主宰 T_access ≈ 2 × T_avg seek 經驗法則 p.628-631
Logical blocks disk controller 將邏輯 block 對映 (surface, track, sector) B 個 sector 大小的 blocks p.631
I/O bus + DMA memory-mapped I/O 下指令 → DMA 直傳 → interrupt 通知 USB 3.0 = 625 MB/s p.632-635
SSD Flash + FTL;讀快寫慢;寫入需整個 block 先 erase block 約 10^5 次寫入後磨損 p.636-638
Trends 密度/成本進步遠快於存取時間;CPU-記憶體差距擴大 DRAM $/MB 降 44,000×,存取僅降 10× p.638-640

6.1.1 隨機存取記憶體 (RAM)

SRAM vs DRAM (p.617-618)

RAM 分兩種:SRAM (static RAM) 用於 CPU 晶片內外的 cache;DRAM (dynamic RAM) 用於主記憶體 (main memory) 與繪圖系統的 frame buffer。典型桌機 SRAM 只有數十 MB,DRAM 則有數百到數千 MB。

特性 SRAM DRAM
每 bit 電晶體數 6 1
相對存取時間 10×
持久 (persistent)? 是(供電期間) 否(需 refresh)
對干擾敏感?
相對成本 1,000×
用途 Cache memory Main memory、frame buffer
「persistent」在此指供電期間不需 refresh;SRAM 與 DRAM 都是 volatile——斷電後兩者資料皆消失。真正斷電後保存資料的是 nonvolatile memory(ROM/Flash,見下)。

Conventional DRAM 的組織與 RAS/CAS 讀取 (p.618-620)

DRAM 晶片的 cell 被分割成 dsupercell(此為本書為避免「cell/word」歧義而採用的術語,p.619 Aside),每個含 w 個 cell(bit);一顆 d × w DRAM 共儲存 dw bits。supercell 排成 rc 行的矩形陣列(rc = d),每個 supercell 位址為 (i, j)。資訊經 pin(每 pin 傳 1 bit)進出:例如 16×8 晶片有 8 支 data pin 與 2 支 addr pin

memory controller 讀取 supercell (i, j) 的流程——RAS (row access strobe) 後接 CAS (column access strobe),兩者共用同一組位址 pin:

步驟 1:RAS = i(選列)                步驟 2:CAS = j(選行)
┌────────────┐  addr: i   ┌──────────┐  addr: j   ┌──────────┐
│   Memory   │ ─────────► │  DRAM    │ ─────────► │  DRAM    │
│ controller │            │ 整列 i   │            │ 從 row   │
│            │            │ 複製到   │   data     │ buffer   │
│            │            │ internal │ ◄───────── │ 取 (i,j) │
└────────────┘            │row buffer│  w bits    │ 送回     │
                          └──────────┘            └──────────┘
定址位元最佳化(Practice Problem 6.1 模式):給定 d 個 supercell,選 r × c 使 max(br, bc) 最小(brbc 為列/行定址所需位元數)——取最接近正方形的 2 的冪次分解;d 為 2 的奇數次冪時 brbc 差 1。

Memory Modules (p.620-621)

DRAM 晶片封裝在記憶體模組 (memory module) 上,插入主機板擴充槽。Core i7 使用 240-pin DIMM (dual inline memory module),以 64-bit 為單位與 memory controller 傳輸。

Enhanced DRAMs (p.621-622)

各種增強型 DRAM 皆基於 conventional DRAM cell,優化基本 cell 的存取速度:

類型 改進機制
FPM DRAM (fast page mode) conventional DRAM 把整列複製進 row buffer 卻只用一個就丟棄;FPM 讓同一列的連續存取直接由 row buffer 供應:讀同列 4 個 supercell 只需 1 次 RAS/CAS + 3 次 CAS(而非 4 組 RAS/CAS)
EDO DRAM (extended data out) FPM 的加強版,允許各 CAS 訊號時間間隔更近
SDRAM (synchronous) conventional/FPM/EDO 皆為非同步(用明確控制訊號);SDRAM 以驅動 memory controller 的外部時脈上升緣取代多數控制訊號,輸出 supercell 速率更快
DDR SDRAM (double data-rate) 使用時脈兩個邊緣作控制訊號使速度加倍;依 prefetch buffer 大小分級:DDR = 2 bits、DDR2 = 4 bits、DDR3 = 8 bits(Core i7 只支援 DDR3)
VRAM (video RAM) 用於 frame buffer,精神類似 FPM;差異:(1) 輸出為整個內部 buffer 依序移出 (2) 允許同時讀寫(邊以 frame buffer 像素畫螢幕、邊寫入下一幀)

歷史脈絡 (p.622 Aside):FPM(1995 前主流)→ EDO(1996-1999)→ SDRAM/DDR(2002 起多數 PC)→ DDR3(2010 起伺服器與桌機主流)。

Nonvolatile Memory (p.622-623)

DRAM/SRAM 為 volatile(斷電失去資訊);nonvolatile memory 斷電後仍保存資訊,因歷史因素統稱 ROM (read-only memory)——即使有些其實可寫。分類依據:可重寫(reprogram)次數重寫機制

Accessing Main Memory:Bus Transactions (p.623-625)

CPU 與 DRAM 主記憶體間的資料經共享電氣通道 bus 流動,每次傳輸由一系列步驟構成,稱 bus transaction:read transaction(主記憶體→CPU)、write transaction(CPU→主記憶體)。bus 是一組平行導線,攜帶位址、資料、控制訊號(依設計,位址與資料可共用或分開導線;控制線負責同步並識別交易類型)。

CPU chip
┌───────────────────────┐
│  Register file        │
│        │    ALU       │
│  ┌─────┴───────┐      │  system bus   ┌────────┐  memory bus   ┌────────┐
│  │Bus interface│◄─────┼──────────────►│  I/O   │◄─────────────►│  Main  │
│  └─────────────┘      │               │ bridge │               │ memory │
└───────────────────────┘               └────────┘               └────────┘
                                    (含 memory controller)

I/O bridge(chipset,含 memory controller)負責轉換 system bus 與 memory bus 的電氣訊號,也把兩者連上 I/O bus(見 6.1.2)。

Read transaction(movq A,%rax,把位址 A 的內容載入 %rax)三步驟:

  1. CPU 的 bus interface 電路把位址 A 放上 system bus;I/O bridge 轉傳至 memory bus。
  2. 主記憶體感測 memory bus 上的位址訊號,從 DRAM 取出資料字組 x 寫上 memory bus;I/O bridge 轉為 system bus 訊號傳回。
  3. CPU 從 system bus 感測並讀取資料,複製進 %rax

Write transaction(movq %rax,A)三步驟:

  1. CPU 把位址 A 放上 system bus;記憶體從 memory bus 讀取位址後等待資料到達
  2. CPU 把 %rax 中的資料 y 複製到 system bus。
  3. 主記憶體從 memory bus 讀取 y,存入 DRAM 位址 A
實際 bus 設計(northbridge/southbridge chipset、Pentium/Core 2 的 FSB、AMD HyperTransport、Core i7 的 QuickPath)各家不同且快速演變 (p.624 Aside);本書採用上述簡化抽象模型,足以捕捉主要概念。

6.1.2 磁碟儲存 (Disk Storage)

磁碟容量達數百至數千 GB(RAM 為數百至數千 MB),但讀取需毫秒級——比 DRAM 慢約 10 萬倍、比 SRAM 慢約 100 萬倍 (p.625)。

Disk Geometry (p.625-627)

單一 platter 俯視                        多 platter 側視(cylinder k)
      ┌───── track(同心圓)             Surface 0 ──┐
   ╭──┴───╮                             Surface 1 ──┴─ Platter 0
  ╱ ╭────╮ ╲   ← sector(track 上        Surface 2 ──┐
 │ │spindle │ │    的等長分段,           Surface 3 ──┴─ Platter 1   cylinder k =
 │ │ (軸)  │ │    典型 512 bytes)       Surface 4 ──┐              所有 surface 上
  ╲ ╰────╯ ╱   ← gap(存格式化位元,      Surface 5 ──┴─ Platter 2   等距的 track k
   ╰──────╯        分隔並識別 sector)         │                     的集合
                                           spindle

Disk Capacity (p.627-628)

最大容量由三項技術因素決定:recording density(bits/in,1 英寸磁軌可塞入的位元數)、track density(tracks/in,1 英寸半徑可塞入的磁軌數)、areal density(bits/in²)= recording density × track density,約每兩年翻倍。

Capacity=# bytessector×avg. # sectorstrack×# trackssurface×# surfacesplatter×# plattersdisk

範例:5 platters、512 bytes/sector、20,000 tracks/surface、平均 300 sectors/track:
512 × 300 × 20,000 × 2 × 5 = 30,720,000,000 bytes = 30.72 GB(製造商以 1 GB = 10^9 bytes1 TB = 10^12 bytes 標示)。

單位陷阱 (p.628 Aside):DRAM/SRAM 容量慣用 K=2^10, M=2^20, G=2^30, T=2^40;磁碟、網路容量與傳輸速率慣用 K=10^3, M=10^6, G=10^9, T=10^12。粗估時差異不大:(2^30 − 10^9)/10^9 ≈ 7%(2^40 − 10^12)/10^12 ≈ 10%。另注意 formatted capacity 小於最大容量:格式化需在 gap 填入 sector 識別資訊、剔除瑕疵 cylinder、並在各 zone 保留備用 (spare) cylinder (p.632 Aside)。

Disk Operation 與存取時間 (p.628-631)

read/write head 位於 actuator arm 末端;arm 沿半徑方向移動即 seek,可將 head 定位到任意 track。head 以約 0.1 micron 高度、約 80 km/h 速度「飛」在盤面氣墊上(比喻:把摩天大樓橫放、離地 2.5 cm 繞地球飛行,8 秒一圈)——撞到灰塵即 head crash,故磁碟一律密封。多 platter 磁碟每個 surface 一個 head,所有 head 垂直對齊、同步移動,任一時刻皆位於同一 cylinder 上。

磁碟以 sector 為單位讀寫,存取一個 sector 的時間有三個主要成分:

成分 定義 公式 / 典型值
Seek time 移動 arm 使 head 對準目標 track T_avg seek3-9 ms(隨機 seek 平均);T_max seek 可達 20 ms
Rotational latency 等待目標 sector 第一個 bit 轉到 head 下方(最壞情況剛好錯過,等一整圈) T_max rotation = (1/RPM) × (60 secs/1 min);T_avg rotation = (1/2) × T_max rotation
Transfer time 讀寫 sector 內容 T_avg transfer = (1/RPM) × (1/(avg # sectors/track)) × (60 secs/1 min)
Taccess=Tavg seek+Tavg rotation+Tavg transfer

範例(7,200 RPM、T_avg seek = 9 ms、400 sectors/track):

三個關鍵結論 (p.631):

  1. 存取時間由 seek time 與 rotational latency 主宰;存取 sector 的第一個 byte 最貴,其餘 bytes 幾乎免費
  2. seek time 與 rotational latency 大致相當,故 2 × T_avg seek 是估算磁碟存取時間的簡便經驗法則。
  3. 量級對比:64-bit word 存取 SRAM 約 4 ns、DRAM 約 60 ns;讀 512-byte block:SRAM ≈ 256 ns、DRAM ≈ 4,000 ns、磁碟 ≈ 10 ms——比 SRAM 慢約 40,000 倍、比 DRAM 慢約 2,500 倍

Logical Disk Blocks (p.631)

現代磁碟幾何複雜(多 surface、各 surface 有多個 recording zone),對作業系統呈現簡化視圖:B 個 sector 大小的 logical blocks,編號 0, 1, ..., B−1。磁碟封裝內的小型硬體/韌體裝置 disk controller 維護 logical block number 與實體 sector 間的對映:

循序 vs 隨機讀取(Practice Problem 6.4 模式):循序讀 n 個 block ≈ 一次 T_avg seek + T_avg rotation + n 個 block 的連續 transfer;隨機對映則每個 block 都要付一次 seek + rotation,總時間可差數千倍。這是 06-Memory-Hierarchy/02-Locality-and-Memory-Hierarchy 中 spatial locality 如此重要的硬體根源之一。

Connecting I/O Devices (p.632-633)

I/O 裝置(顯示卡、螢幕、滑鼠、鍵盤、磁碟)經 I/O bus 連接 CPU 與主記憶體。與 CPU 專屬的 system bus / memory bus 不同,I/O bus 設計為與底層 CPU 無關;雖然較慢,但能容納多樣的第三方裝置:

CPU ── system bus ── I/O bridge ── memory bus ── Main memory
                         │
      ═══════════════ I/O bus ═══════════════════════════════
        │              │               │                │
    USB controller  Graphics       Host bus         expansion slots
    (滑鼠/鍵盤/     adapter        adapter          (其他裝置,如
     SSD 等)      (畫螢幕像素)   (SCSI/SATA)        network adapter)
                                     │
                                Disk controller ── Disk drive

Accessing Disks:Memory-Mapped I/O、DMA、Interrupt (p.633-635)

CPU 以 memory-mapped I/O 技術對 I/O 裝置下指令:位址空間中保留一塊位址與 I/O 裝置通訊,每個這種位址稱為 I/O port;裝置接上 bus 時被對映到一或多個 port。

(1) CPU 發起讀取:對 disk controller 的 port(如 0xa0)執行三個 store
    ① 命令字(初始化讀取 + 參數,如完成後是否 interrupt)
    ② 要讀的 logical block number
    ③ 目的主記憶體位址
        CPU ──store×3──► Disk controller        (CPU 隨即去做其他工作)

(2) DMA transfer:controller 把 logical block 轉成 sector 位址、讀出內容
        Disk ──► Disk controller ──(完全不經 CPU)──► Main memory

(3) 完成通知:
        Disk controller ──interrupt(觸發 CPU 外部接腳)──► CPU
        CPU 停下當前工作,跳到 OS 例程記錄 I/O 完成,再返回被中斷處

商用磁碟實例(Seagate Barracuda 7400,p.636 Aside):formatted capacity 3 TB、3 platters / 6 surfaces、7,200 RPM、平均 seek 8.5 ms、平均 rotational latency 4.16 ms、track-to-track seek 1.0 ms、平均傳輸率 156 MB/s、logical block 512 bytes、共 5,860,533,168 個 logical blocks。

6.1.3 固態硬碟 (Solid State Disks)

SSD 是基於 flash memory(6.1.1)的儲存技術,插入 I/O bus 上的標準磁碟插槽(典型為 USB 或 SATA),行為與一般磁碟相同——處理 CPU 對 logical disk block 的讀寫請求。SSD 封裝 = 一或多顆 flash memory 晶片(取代旋轉磁碟的機械裝置)+ flash translation layer (FTL)(硬體/韌體裝置,角色等同 disk controller,把 logical block 請求轉譯為底層實體裝置的存取)。

              I/O bus(USB / SATA)
                     │  logical disk block 讀寫請求
        ┌────────────┴──────────────┐
        │  Flash translation layer  │ ← 位址對映 / wear leveling / 寫入攤銷
        ├───────────────────────────┤
        │ Flash memory              │
        │ ┌Block 0───────────┐     ┌Block B-1─────────┐
        │ │Page 0│Page 1│…│Page P-1│…│Page 0│…│Page P-1│
        │ └──────────────────┘     └──────────────────┘
        └───────────────────────────┘

隨機寫入比讀取慢的兩個原因 (p.637):

  1. erase block 相當慢——約 1 ms,比存取一個 page 高一個數量級以上。
  2. 若寫入操作要修改已含資料的 page p(即非全 1),則同 block 中所有含有用資料的 page 必須先複製到一個新的(已 erase)block,才能寫入 p。FTL 以複雜邏輯攤銷 erase 成本、盡量減少內部複製,但隨機寫入不太可能追上讀取效能。
性能項目(Intel SSD 730,4 KB blocks,p.637) 讀 (Reads) 寫 (Writes)
循序 throughput 550 MB/s 470 MB/s
隨機 throughput (IOPS) 89,000 IOPS 74,000 IOPS
隨機 throughput (MB/s) 365 MB/s 303 MB/s
平均循序存取時間 50 μs 60 μs

優缺點比較:

SSD Rotating disk
隨機存取時間 快得多(半導體、無移動零件) 慢(seek + rotation)
功耗 / 耐用度 較低 / 較耐震 (rugged) 較高 / 怕震、head crash
磨損 flash block 寫入次數有限;FTL 的 wear-leveling 把 erase 平均分散到所有 block,實務上需多年才磨損 機械磨損
單位成本與容量 每 byte 約貴 30 倍、容量較小(差距隨普及快速縮小) 便宜、容量大

SSD 已完全取代可攜式音樂裝置中的旋轉磁碟、在筆電中流行,並開始進入桌機與伺服器 (p.637)。

SSD 壽命估算(Practice Problem 6.5 模式):壽命 = 保證總寫入量 ÷ 寫入速率。如 Intel 保證 128 PB(128 × 10^15 bytes)寫入:以 470 MB/s 連續循序寫 ≈ 8.6 年;以 303 MB/s 隨機寫 ≈ 13.4 年;以 20 GB/day 平均寫 ≈ 17,500 年——磨損在實務上幾乎不是問題。

6.1.4 儲存技術趨勢 (p.638-640)

  1. 不同儲存技術有不同的價格/性能取捨:SRAM 略快於 DRAM,DRAM 遠快於 disk;快的儲存永遠比慢的貴。SSD 介於 DRAM 與 rotating disk 之間
  2. 價格與性能以劇烈不同的速率演進(1985-2015,Figure 6.15):
技術 成本改善 存取時間改善
SRAM $/MB 降約 116× 115×(大致同步)
DRAM $/MB 降 44,000×(四個數量級以上) 10×
Rotating disk $/GB 降 3,333,333×(六個數量級以上) seek time 僅 25×

→ 基本事實:提高密度(降低成本)遠比降低存取時間容易

  1. DRAM 與 disk 性能落後 CPU 且差距擴大:1985-2010 CPU cycle time 改善 500×;effective cycle time(單一 CPU 的 cycle time ÷ 核心數)改善 2,000×(至 2015 約 2,075×)。2003 年左右 CPU 性能曲線分裂,反映多核心處理器的引入——之後單核 cycle time 一度微升再緩降。SRAM 性能雖落後但大致跟得上;CPU 與 DRAM/disk 的差距在多核心出現前是延遲 (latency) 問題(存取時間降得比 CPU cycle time 慢),之後日益成為吞吐量 (throughput) 問題(多核心平行對 DRAM 與 disk 發出請求)。
時間 (ns, 半對數尺度;Figure 6.16 示意)
10^7 ┤●────●────●────●──  Disk seek time(降得很慢)
10^5 ┤              ●───  SSD access time
10^2 ┤●───●────●────●──  DRAM access time(降得慢)
10^1 ┤ ●───●───●────●─  SRAM access time
10^0 ┤  ●──●──●╮
10^-1┤          ╰●───●─  CPU / effective CPU cycle time(降得快;2003 多核分裂)
     └──┬────┬────┬────┬──
       1985  1995  2005  2015      → gap 持續擴大

現代電腦大量使用 SRAM cache 來彌合處理器-記憶體差距;此法之所以有效,靠的是應用程式的基本性質 locality——見 06-Memory-Hierarchy/02-Locality-and-Memory-Hierarchy

Exam/Test Patterns

情境 / 關鍵字 答案
SRAM vs DRAM:每 bit 電晶體/速度/成本/用途 SRAM:6T、1×、1,000×、cache;DRAM:1T+電容、10×、1×、main memory 與 frame buffer
為何 DRAM 需要 refresh 漏電流使電容 10-100 ms 內失去電荷;須週期性讀出再寫回;可加 ECC(64-bit 以 72 bits 編碼)修正單一位元錯誤
DRAM 為何組成二維陣列 減少 addr pin 數;代價是位址分 RAS/CAS 兩步傳送,增加存取時間
給定 d 個 supercell 求最佳 r×c 使 max(br, bc) 最小 → 取最接近正方形的 2 的冪次分解
讀 supercell (i,j) 的順序 先送 RAS = i(整列複製到 internal row buffer)再送 CAS = j(從 row buffer 取出該 supercell 的 w bits)
FPM DRAM 讀同列 4 個 supercell 1 次 RAS/CAS + 3 次 CAS(conventional 需 4 次 RAS/CAS)
DDR / DDR2 / DDR3 差異 prefetch buffer 大小:2 / 4 / 8 bits;皆用時脈雙邊緣傳輸
PROM / EPROM / EEPROM 可重寫次數 1 次 / 約 1,000 次(紫外線清除)/ 約 10^5 次(電氣、就地重寫)
movq A,%rax 在 bus 上發生什麼 read transaction 三步:CPU 放位址 → 記憶體取出資料放上 bus → CPU 讀入暫存器
磁碟容量計算 套五因子公式;注意 surfaces = 2 × platters、cylinders = tracks/surface;disk 用 G = 10^9
給 RPM、T_avg seek、sectors/track 求存取時間 T_avg rotation = 0.5 × (60/RPM) × 1000 ms;T_avg transfer = T_max rotation ÷ (sectors/track);三者相加
磁碟存取時間的快速估計 2 × T_avg seek(seek 與 rotation 約略相等;transfer 相對可忽略)
循序讀檔 vs 隨機讀檔時間 循序:1 次 (seek + rotation) + 連續 transfer;隨機:每個 block 各付一次 (seek + rotation)
logical block → 實體位置 disk controller 韌體查表轉成 (surface, track, sector) 三元組
CPU 讀磁碟三階段 memory-mapped I/O 對 I/O port 下命令(命令字、block number、目的位址)→ disk controller DMA transfer 直入主記憶體 → interrupt 通知 CPU
SSD 讀寫單位與 erase 單位 讀寫以 page 為單位;erase 以 block 為單位;page 須待整個 block erase 後才能寫
SSD 隨機寫入為何慢 (1) erase block 約 1 ms,比 page 存取慢一個數量級以上;(2) 寫既有資料的 page 前,同 block 有用 pages 須先複製到新 block
SSD 磨損對策與壽命估算 FTL 的 wear-leveling 平均分散 erase;壽命 = 保證寫入總量 ÷ 寫入速率
儲存技術長期趨勢 密度/成本改善遠快於存取時間;CPU-DRAM/disk gap 擴大;多核後由 latency 轉為 throughput 問題
為何 cache 能彌合 CPU-memory gap SRAM 快 + 程式具 locality(下一節主題)