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