DMA 與程式化 I/O 的差異:比較資料傳輸方式
在裝置與記憶體之間搬移資料的方式有兩種。程式化 I/O(PIO)是由 CPU 自己透過暫存器一個字一個字地讀寫。直接記憶體存取(DMA)則由 DMA 控制器自行搬移資料,CPU 只負責準備傳輸,結束時會收到通知。DMA 能釋放 CPU,大量傳輸也快得多,但準備工作較費事,也需要多加留意。
| 項目 | 程式化 I/O(PIO) | DMA |
|---|---|---|
| 搬移資料的主體 | CPU。以載入與儲存指令一個字一個字地搬 | DMA 控制器,或裝置本身。直接往返記憶體 |
| CPU 負載 | 高。傳輸期間 CPU 全程被占用 | 低。CPU 準備好傳輸後就能做其他工作 |
| 大量傳輸的傳輸量 | 受限於 CPU 的速度 | 高 |
| 準備的額外負擔 | 無 | 需要設定位址、長度與描述子,並處理完成事件 |
| 小量傳輸 | 因為不需準備,多半較快 | 準備成本可能超過其優點 |
| 複雜度 | 簡單 | 複雜。描述子環、緩衝區對齊、快取一致性、IOMMU 的設定 |
| 記憶體匯流排的使用 | 經由 CPU | DMA 引擎與 CPU 爭奪記憶體頻寬 |
| 主要用途 | 小型控制用暫存器、簡單的感測器、舊式的 PIO 模式 | SSD 與 NVMe、網路卡、音訊緩衝區、ADC 取樣值的連續傳輸、傳送到 GPU |
數值為具代表性的大致參考值,會因世代或產品而異。