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