????到目前為止旭咽,幾乎每個(gè)人都聽說過Linux下的零拷貝功能,但是赌厅,對(duì)零拷貝深入理解的人并不多穷绵;因此,我決定寫一些文章略微深入的講述這個(gè)問題特愿,希望能將這個(gè)有用的特性解釋清楚仲墨。在這篇文章中,我打算從用戶視角對(duì)零拷貝進(jìn)行闡述揍障,對(duì)于內(nèi)核級(jí)別的細(xì)節(jié)將會(huì)被有意地省略目养。
????什么是零拷貝?
????為了更好地理解問題的答案毒嫡,我們需要理解清楚問題癌蚁;我們思考一下,一個(gè)網(wǎng)絡(luò)服務(wù)器通過網(wǎng)絡(luò)將存儲(chǔ)在文件中的數(shù)據(jù)傳輸?shù)娇蛻舳硕祷@么一個(gè)簡單的過程對(duì)應(yīng)的樣例代碼:
????read(file, tmp_buf, len);?
????write(socket, tmp_buf, len);
????看起來十分簡單努释,感覺這兩句調(diào)用不會(huì)帶來很多的開銷;實(shí)際上咬摇,想象和事實(shí)差距蠻大伐蒂;在這兩句簡單的調(diào)用背后,數(shù)據(jù)至少被拷貝不下于四次肛鹏,并且進(jìn)行了多次用戶/內(nèi)核上下文切換逸邦。實(shí)際上,這個(gè)過程遠(yuǎn)不僅僅如此在扰,涉及的內(nèi)容更加復(fù)雜缕减,但是,為了文章的簡單易懂健田,對(duì)這一部分進(jìn)行簡化烛卧;
read&write
mmap&write
sendfile
硬件支持&零拷貝