dma(直接記憶體訪問 direct memory access)
dma模式可以同dma engine之間通過硬體將資料從buffer 1移動到buffer 2,允許計算機主機板上的裝置直接把資料傳送到記憶體中去,而不需要cpu參與操作,大大降低了cpu copy的開銷。
傳統tcp/ip技術在資料報處理過程中,要經過作業系統及其他軟體層,需要占用大量的伺服器資源和記憶體匯流排頻寬,資料在系統記憶體、處理器快取和網路控制器快取之間來回進行複製移動,通過cpu進行資料copy來移動資料,將buffer 1中的資料移動到buffer 2中,給伺服器的cpu和記憶體造成了沉重負擔。尤其是網路頻寬、處理器速度與記憶體頻寬的嚴重「不匹配性」,更加劇了網路延遲效應。
使用者程序想要執行io操作時(向磁碟讀資料,寫資料),由於使用者程序工作在使用者模式下,它沒有執行這些操作的許可權,只能通過發起對應的系統呼叫請求作業系統幫忙完成這些操作,這裡因為系統呼叫產生中斷將陷入到核心,進行一次上下文切換操作。
核心程序幫忙執行io操作時,由於io操作相比於cpu來說是極慢的操作,cpu不應該等待在這個過程中,而是切換到其他程序上去執行其他任務,又得上下文切換,從核心態回到使用者態。
在以前,確實是作業系統程序掌控cpu來參與io操作,但是現在都是使用dma技術,也就是可以直接讀,寫記憶體,而不再需要作業系統做這樣的操作。
dma要求硬體支援,需要在硬體中整合乙個小型的"cpu",比如現在的機械硬碟,固態硬碟,網絡卡等硬體都帶有dma功能,這樣作業系統要執行io操作時,直接將相關指令傳送給這些dma硬體,dma處理器負責io操作,而作業系統這時可以放棄cpu,讓cpu去執行其他程序。
如:對於讀磁碟檔案時,作業系統將相關指令以及資料應該寫在哪個記憶體位址傳送給dma硬體後,由dma硬體去讀寫資料到指定記憶體位址,當io操作完成後,dma硬體通過匯流排傳送乙個硬體中斷給cpu,於是陷入到核心態(一次上下文切換),核心就知道了io已經完成,於是將kernel buffer資料拷貝到使用者程序的io buffer,並準備排程使用者程序(上下文切換)
使用dma後,只有4次必要的上下文切換,且io操作的過程中完全不需要消耗cpu資源。
rdma:
前面介紹緩衝空間時提到過,一般情況下,每個使用者程序要讀、寫資料,都會經過兩個必要的緩衝層:核心空間的kernel buffer、使用者空間的io buffer,如:讀檔案資料時,先將資料拷貝到核心的緩衝空間(page cache),然後陷入核心,核心將該緩衝空間資料拷貝到使用者空間的緩衝空間(io buffer),當排程到使用者程序時,使用者程序從自己的緩衝空間讀取資料。
dma機制並沒有繞過這兩個緩衝層,但使用rdma機制,程式可以直接繞過kernel buffer,核心發現是rdma操作後,直接告訴rdma硬體將讀取的資料,寫入到使用者空間的io buffer,而不需要先拷貝到kernel buffer,再拷貝到io buffer,雖然rdma比dma不會減少上下文切換的次數,但是是它減少了記憶體資料拷貝的過程,相當於是使用了o_direct標記的直接io技術。
rdma一般實現在網絡卡上。
rdma技術是核心旁路技術的一種
rdma操作:
1 rdma send | rdma傳送(/接收)操作 (send/recv)
跟tcp/ip的send/recv是類似的,不同的是rdma是基於訊息的資料傳輸協議(而不是基於位元組流的傳輸協議),所有資料報的組裝都在rdma硬體上完成的,也就是說osi模型中的下面4層(傳輸層,網路層,資料鏈路層,物理層)都在rdma硬體上完成。
2 rdma read | rdma讀操作 (pull)
rdma讀操作本質上就是pull操作, 把遠端系統記憶體裡的資料拉回到本地系統的記憶體裡。
3 rdma write | rdma寫操作 (push)
rdma寫操作本質上就是push操作,把本地系統記憶體裡的資料推送到遠端系統的記憶體裡。
4 rdma write with immediate data | 支援立即的rdma寫操作
支援立即的rdma寫操作本質上就是給遠端系統push(推送)帶外(oob)資料, 這跟tcp裡的帶外資料是類似的。
oob資料特點:
1.oob資料每次只能是乙個字元
2.普通資料使用一般方式接收與傳送,oob資料使用msg_oob接收與傳送
3.乙個資料使用msg_oob,則最後乙個字元是oob資料,其他的是非oob資料
4.oob資料是優先資料。優先體現在什麼地方?
在我看來oob資料優先體現在同一次傳送資料(包含普通資料和oob資料)時,oob資料會優先於普通資料到達目標端。下邊有例項可以認證這一點。
帶外資料傳送過程:和普通資料傳送過程一樣,只是在資料字串最後乙個字元處設定乙個標記,目標端接收到字串,也是存放在乙個描述符號中,但是會將指標指向最後乙個字元上;接收程序發現字元上有帶外資料標記,會傳送訊號sigurg(緊急資料),即帶外資料的優先順序體現在訊號的優先。
個人總結的RDMA網路原理
一 基本知識 rdma remote direct memory access 技術全稱遠端直接記憶體訪問,就是為了解決網路傳輸中客戶端與伺服器端資料處理的延遲而產生的。它將資料直接從一台計算機的記憶體傳輸到另一台計算機,無需雙方作業系統的介入。這允許高吞吐 低延遲的網路通訊,尤其適合在大規模並行計...
rdma程式設計
在分布式應用中,用乙太網組網往往成為效能的瓶頸,所以需要低時延大頻寬,使用rdma傳輸協議,能滿足低時延要求。目前有兩張硬體可以使用rdma傳輸,乙個是infiniband,乙個是rdma over ethernet,由於ib的成本較高,所以roce成為一種趨勢。roce可以在乙太網上執行rdma協...
epoll原理剖析
首先我們來定義流的概念,乙個流可以是檔案,socket,pipe等等可以進行i o操作的核心物件。不管是檔案,還是套接字,還是管道,我們都可以把他們看作流。之後我們來討論i o的操作,通過read,我們可以從流中讀入資料 通過write,我們可以往流寫入資料。現在假定乙個情形,我們需要從流中讀資料,...