系統 CPU 效率高,DMA 技術功不可沒!
?大家好,我是樹哥。
相信大家在學習 Kafka 的時候,都會被問到:為啥 Kafka 這么快?許多朋友都會回答是因為 zero-copy 技術。而一說到 Zero-copy 就會說到 DMA 技術。
但 DMA 技術到底是啥?它誕生的背景是什么?它解決了什么問題?估計很多人就不知道了。今天就讓我帶大家盤一盤 DMA 技術!
什么是 DMA?
DMA,全稱 Direct Memory Access,即直接存儲器訪問。
DMA 傳輸將數據從一個地址空間復制到另一個地址空間,提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。
從 DMA 的定義我們可以知道,其主要是用來傳輸數據,并且是在外設和存儲器或者存儲器與存儲器之間傳輸數據。
那為啥要通過 DMA 來進行傳輸數據呢?
原因是:之前傳輸數據需要 CPU 參與,在大量數據傳輸時會消耗 CPU 資源。
因此為了提升 CPU 利用率,出現了 DMA 技術,即直接讓內存與磁盤進行數據傳輸。
在 DMA 技術出現之前,Linux 通過 I/O 中斷的方式來傳輸數據,其流程如下圖所示:
IO 中斷方式的數據傳輸流程
- 用戶進程向 CPU 發起 read 系統調用讀取數據,由用戶態切換為內核態,然后一直阻塞等待數據的返回。
- CPU 在接收到指令以后對磁盤發起 I/O 請求,將磁盤數據先放入磁盤控制器緩沖區。
- 數據準備完成以后,磁盤向 CPU 發起 I/O 中斷。
- CPU 收到 I/O 中斷以后將磁盤緩沖區中的數據拷貝到內核緩沖區,然后再從內核緩沖區拷貝到用戶緩沖區。
用戶進程由內核態切換回用戶態,解除阻塞狀態,然后等待 CPU 的下一個執行時間鐘。
從上述流程可以看到,CPU 需要參與到「磁盤緩沖區拷貝到內核緩沖區」、「內核緩沖區拷貝到用戶緩存區」這兩個過程,極大地消耗了 CPU 資源。但有了 DMA 技術之后,其過程變成了這樣:
DMA 方式的數據傳輸流程
- 用戶進程向 CPU 發起 read 系統調用讀取數據,由用戶態切換為內核態,然后一直阻塞等待數據的返回。
- CPU 在接收到指令以后對 DMA 磁盤控制器發起調度指令。
- DMA 磁盤控制器對磁盤發起 I/O 請求,將磁盤數據先放入磁盤控制器緩沖區,CPU 全程不參與此過程。
- 數據讀取完成后,DMA 磁盤控制器會接受到磁盤的通知,將數據從磁盤控制器緩沖區拷貝到內核緩沖區。
- DMA 磁盤控制器向 CPU 發出數據讀完的信號,由 CPU 負責將數據從內核緩沖區拷貝到用戶緩沖區。
- 用戶進程由內核態切換回用戶態,解除阻塞狀態,然后等待 CPU 的下一個執行時間鐘。
仔細對比加入 DMA 技術之后的數據傳輸流程,我們可以發現 DMA 技術優化了數據從磁盤緩沖區拷貝到內核緩沖區這個過程,減少了這個過程里 CPU 的參與。
實現原理
我們知道數據傳輸本質上還是需要 CPU 去處理的,那 DMA 技術怎么實現不需要 CPU 參與就能實現數據傳輸呢?
雖然我并沒有仔細地看過 DMA 的實現原理,但可以大膽預測的是:其實 DMA 技術還是有用 CPU,只不過其沒有用服務器的 CPU,而是自己配了一個計算單元,專門用于做數據傳輸。這就有點像 CPU 既可以做普通計算又可以做圖形計算一樣,但因為圖形渲染太復雜,于是搞出來了個 GPU 專門做圖形渲染一樣。
DMA 本質是就是一個硬件技術,其實際樣子是主板上的一個芯片,即 DMAC (DMA Controller DMA 控制器)以及 I/O 設備上的 DMAC 芯片。
通過在各個 I/O 設備上都加了 DMAC 芯片,以網卡為例,用戶發送數據,當數據被映射到內核后,CPU 只需要告訴 DMAC 這個芯片,「我」要發 xxx 數據,打算發到哪里去,你幫我去做吧,然后 CPU 就可以走了,繼續做其它事情。
DMA 最有價值的地方體現在當要傳輸的數據特別大、還要求速度特別快的時候,可以有效減少 CPU 的阻塞時間。
目前大多數的硬件設備,包括磁盤控制器、網卡、顯卡以及聲卡等都支持 DMA 技術。通過 DMA 和虛擬內存技術,我們實現了 Zero Copy 的目標,IO 設備跟用戶程序空間傳輸數據的過程中,減少數據拷貝次數,減少系統調用,實現 CPU 的零參與,徹底消除 CPU 在這方面的負載。
總結
所謂的 DMA(Direct Memory Access,即直接存儲器訪問)其實是一個硬件技術,其主要目的是減少大數據量傳輸時的 CPU 消耗,從而提高 CPU 利用效率。其本質上是一個主板和 IO 設備上的 DMAC 芯片。CPU 通過調度 DMAC 可以不參與磁盤緩沖區到內核緩沖區的數據傳輸消耗,從而提高效率。
參考資料
- 前面部分講的還可以!【STM32】 DMA 原理,步驟超細詳解,一文看懂 DMA_Z 小旋的博客 - CSDN 博客_dma stm32
- VIP!不錯!“零拷貝” 的硬件基石 ——DMA 到底是個什么東西,它是如何工作的?- 墨天輪
- 圖畫得不錯!VIP!DMA 技術是什么,在哪里用?看完絕對有收獲 - 簡書
- 關于 DMA(Direct memory access)比較通俗淺白的理解 - 騰訊云開發者社區 - 騰訊云?