|
前言程序員的終極追求是什么?當系統(tǒng)流量大增,用戶體驗卻絲滑依舊?沒錯!然而,在大量文件傳輸、數(shù)據(jù)傳遞的場景中,傳統(tǒng)的“數(shù)據(jù)搬運”卻拖慢了性能。為了解決這一痛點,Linux 推出了 零拷貝 技術,讓數(shù)據(jù)高效傳輸幾乎無需 CPU 操心。今天,我就用最通俗的語言講解零拷貝的工作原理、常見實現(xiàn)方式和實際應用,徹底幫你搞懂這項技術!
1、傳統(tǒng)拷貝:數(shù)據(jù)搬運的“舊時代”為了理解零拷貝,我們先看看傳統(tǒng)數(shù)據(jù)傳輸?shù)墓ぷ鞣绞。想象一下,我們需要把一個大文件從硬盤讀取后發(fā)送到網絡上。這聽起來很簡單,但實際上,傳統(tǒng)的數(shù)據(jù)傳輸涉及多個步驟并占用大量 CPU 資源。
1.1 一個典型的文件傳輸過程(沒有 DMA 技術):假設我們要將一個大文件從硬盤讀取后發(fā)送到網絡。以下是傳統(tǒng)拷貝方式的詳細步驟:讀取數(shù)據(jù)到內核緩沖區(qū):使用 read() 系統(tǒng)調用,數(shù)據(jù)從硬盤讀取到內核緩沖區(qū)。此時,CPU 需要協(xié)調和執(zhí)行相關指令來完成這一步。拷貝數(shù)據(jù)到用戶緩沖區(qū):數(shù)據(jù)從內核緩沖區(qū)被拷貝到用戶空間的緩沖區(qū)。這一步由 read() 調用觸發(fā),CPU 完全負責這次數(shù)據(jù)拷貝。寫入數(shù)據(jù)到內核緩沖區(qū):通過 write() 系統(tǒng)調用,數(shù)據(jù)從用戶緩沖區(qū)被再次拷貝回內核緩沖區(qū)。CPU 再次介入并負責數(shù)據(jù)拷貝。傳輸數(shù)據(jù)到網卡:最終,內核緩沖區(qū)的數(shù)據(jù)被傳輸?shù)骄W卡,發(fā)送到網絡。如果沒有 DMA 技術,CPU 需要拷貝數(shù)據(jù)至網卡。[/ol]1.2 來看個圖,更直觀點: |
|