sendfile機制學習(轉)

在傳統的文件傳輸裏面(read/write方式),在實現上實際上是比較複雜的,須要通過屢次上下文的切換,咱們看一下以下兩行代碼: 緩存

read(file, tmp_buf, len);
write(socket, tmp_buf, len);
  以上兩行代碼是傳統的read/write方式進行文件到socket的傳輸。

當須要對一個文件進行傳輸的時候,其具體流程細節以下: 網絡

 一、調用read函數,文件數據被copy到內核緩衝區 socket

 二、read函數返回,文件數據從內核緩衝區copy到用戶緩衝區 函數

 三、write函數調用,將文件數據從用戶緩衝區copy到內核與socket相關的緩衝區。 性能

 四、數據從socket緩衝區copy到相關協議引擎。 spa

 以上細節是傳統read/write方式進行網絡文件傳輸的方式,咱們能夠看到,在這個過程中,文件數據其實是通過了四次copy操做: code

 硬盤—>內核buf—>用戶buf—>socket相關緩衝區—>協議引擎 it

 而sendfile系統調用則提供了一種減小以上屢次copy,提高文件傳輸性能的方法。Sendfile系統調用是在2.1版本內核時引進的: class

sendfile(socket, file, len);

 運行流程以下: 效率

 一、sendfile系統調用,文件數據被copy至內核緩衝區

 二、再從內核緩衝區copy至內核中socket相關的緩衝區

 三、最後再socket相關的緩衝區copy到協議引擎

     相較傳統read/write方式,2.1版本內核引進的sendfile已經減小了內核緩衝區到user緩衝區,再由user緩衝區到socket相關 緩衝區的文件copy。

    而在內核版本2.4以後,文件描述符結果被改變,sendfile實現了更簡單的方式,系統調用方式仍然同樣。細節與2.1版本的不一樣之處在於,當文件數據被複制到內核緩衝區時,再也不將全部數據copy到socket相關的緩衝區,而是僅僅將記錄數據位置和長度相關的數據保存到 socket相關的緩存。實際數據將由DMA模塊直接發送到協議引擎,再次減小了一次copy操做。

效率 3次copy->1次copy;

相關文章
相關標籤/搜索