DMA 與程式化 I/O 的差異:比較資料傳輸方式

在裝置與記憶體之間搬移資料的方式有兩種。程式化 I/O(PIO)是由 CPU 自己透過暫存器一個字一個字地讀寫。直接記憶體存取(DMA)則由 DMA 控制器自行搬移資料,CPU 只負責準備傳輸,結束時會收到通知。DMA 能釋放 CPU,大量傳輸也快得多,但準備工作較費事,也需要多加留意。

項目程式化 I/O(PIO)DMA
搬移資料的主體CPU。以載入與儲存指令一個字一個字地搬DMA 控制器,或裝置本身。直接往返記憶體
CPU 負載高。傳輸期間 CPU 全程被占用低。CPU 準備好傳輸後就能做其他工作
大量傳輸的傳輸量受限於 CPU 的速度高
準備的額外負擔無需要設定位址、長度與描述子,並處理完成事件
小量傳輸因為不需準備,多半較快準備成本可能超過其優點
複雜度簡單複雜。描述子環、緩衝區對齊、快取一致性、IOMMU 的設定
記憶體匯流排的使用經由 CPUDMA 引擎與 CPU 爭奪記憶體頻寬
主要用途小型控制用暫存器、簡單的感測器、舊式的 PIO 模式SSD 與 NVMe、網路卡、音訊緩衝區、ADC 取樣值的連續傳輸、傳送到 GPU

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

PIO
傳輸量非常小或不常發生,且簡單比 CPU 時間更重要時。
DMA
傳輸量大或連續,不想占用 CPU 時。例如儲存裝置、網路、串流資料。
注意
使用 DMA 時,要確認在裝置讀取之前,或寫入之後,CPU 快取與記憶體是一致的(清除或使快取失效,或使用一致性記憶體)。

常見問題

為什麼 DMA 能減輕 CPU 的負載?

因為 DMA 控制器自行搬移資料,CPU 只需準備傳輸,結束時才會收到通知。

DMA 總是比較快嗎?

不是。在非常小的傳輸中,準備成本會超過優點,程式化 I/O 可能較快。

什麼是 DMA 的描述子環?

位於記憶體上,逐一描述各個緩衝區的描述子所組成的環。像網路卡或 NVMe 磁碟這類裝置,裝置與驅動程式透過它來交接緩衝區。

為什麼 DMA 需要重視快取一致性?

因為裝置會直接讀寫記憶體,CPU 的快取中可能殘留舊資料。軟體必須清除或使快取失效,或使用一致性記憶體。

相關名詞的解說

DMA(直接記憶體存取)
不經過 CPU,直接在周邊裝置與記憶體之間傳輸資料的機制。即使在大量資料傳輸期間,CPU 也能進行其他處理。
中斷
回應外部裝置的請求等,暫時中止執行中的處理,優先進行對應處理的 CPU 機制。結束後回到原本的處理。

相關的比較