日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Zero-Copysendfile浅析

發(fā)布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Zero-Copysendfile浅析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Zero-Copy&sendfile淺析

標(biāo)簽: buffersocket磁盤linuxlighttpdweb服務(wù) 2923人閱讀 評論(0) 收藏 舉報 分類: 高性能服務(wù)器

一、典型IO調(diào)用的問題
一個典型的web服務(wù)器傳送靜態(tài)文件(如CSSJS,圖片等)的過程如下:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

首先調(diào)用read將文件從磁盤讀取到tmp_buf,然后調(diào)用writetmp_buf寫入到socket,在這過程中會出現(xiàn)四次數(shù)據(jù) copy,過程如圖1所示

圖1

?

1。當(dāng)調(diào)用read系統(tǒng)調(diào)用時,通過DMADirect Memory Access)將數(shù)據(jù)copy到內(nèi)核模式
2。然后由CPU控制將內(nèi)核模式數(shù)據(jù)copy到用戶模式下的 buffer
3read調(diào)用完成后,write調(diào)用首先將用戶模式下 buffer中的數(shù)據(jù)copy到內(nèi)核模式下的socket buffer
4。最后通過DMA copy將內(nèi)核模式下的socket buffer中的數(shù)據(jù)copy到網(wǎng)卡設(shè)備中傳送。

從上面的過程可以看出,數(shù)據(jù)白白從內(nèi)核模式到用戶模式走了一 圈,浪費了兩次copy,而這兩次copy都是CPU copy,即占用CPU資源。

?

二、Zero-Copy&Sendfile()
Linux 2.1版本內(nèi)核引入了sendfile函數(shù),用于將文件通過socket傳送。
sendfile(socket, file, len);
該函數(shù)通過一次系統(tǒng)調(diào)用完成了文件的傳送,減少了原來 read/write方式的模式切換。此外更是減少了數(shù)據(jù)的copysendfile的詳細(xì)過程圖2所示:

圖2

通過sendfile傳送文件只需要一次系統(tǒng)調(diào)用,當(dāng)調(diào)用 sendfile時:
1。首先通過DMA copy將數(shù)據(jù)從磁盤讀取到kernel buffer
2。然后通過CPU copy將數(shù)據(jù)從kernel buffer copysokcet buffer
3。最終通過DMA copysocket buffer中數(shù)據(jù)copy到網(wǎng)卡buffer中發(fā)送
sendfileread/write方式相比,少了 一次模式切換一次CPU copy。但是從上述過程中也可以發(fā)現(xiàn)從kernel buffer中將數(shù)據(jù)copysocket buffer是沒必要的。

為此,Linux2.4內(nèi)核對sendfile做了改進(jìn),如圖3所示

圖3

改進(jìn)后的處理過程如下:
1
DMA copy將磁盤數(shù)據(jù)copykernel buffer
2
。向socket buffer中追加當(dāng)前要發(fā)送的數(shù)據(jù)在kernel buffer中的位置和偏移量
3
DMA gather copy根據(jù)socket buffer中的位置和偏移量直接將kernel buffer中的數(shù)據(jù)copy到網(wǎng)卡上。
經(jīng)過上述過程,數(shù)據(jù)只經(jīng)過了2copy就從磁盤傳送出去了。
(可能有人要糾結(jié)不是說ZeroCopy么?怎么還有兩次copy,事實上這個Zero copy是針對內(nèi)核來講的,數(shù)據(jù)在內(nèi)核模式下是Zerocopy的。話說回來,文件本身在瓷盤上要真是完全Zerocopy就能傳送,那才見鬼了 呢)。
當(dāng)前許多高性能http server都引入了sendfile機制,如nginxlighttpd等。

三、Java NIO
中的transferTo()
Java NIO

FileChannel.transferTo(long position, long count, WriteableByteChannel target)
方法將當(dāng)前通道中的數(shù)據(jù)傳送到目標(biāo)通道target中,在支持Zero-Copylinux系統(tǒng)中,transferTo()的實現(xiàn)依賴于 sendfile()調(diào)用。

?

四、參考文檔
Zero Copy I: User-Mode Perspectivehttp://www.linuxjournal.com/article/6345?page=0,0
Efficient data transfer through zero copyhttp://www.ibm.com/developerworks/linux/library/j-zerocopy
The C10K problemhttp://www.kegel.com/c10k.html

總結(jié)

以上是生活随笔為你收集整理的Zero-Copysendfile浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。