天天看點

Linux 進階I/O函數之sendfile

linux手冊介紹sendfile函數:

http://man7.org/linux/man-pages/man2/sendfile.2.html

首先我們來看看傳統的read/write方式進行socket的傳輸。

當需要對一個檔案進行傳輸的時候,具體流程細節如下:

1:調用read函數,檔案資料copy到核心緩沖區

2:read函數傳回,檔案資料從核心緩沖區copy到使用者緩沖區

3:write函數調用,将檔案資料從使用者緩沖區copy到核心與socket相關的緩沖區

4:資料從socket緩沖區copy到相關協定引擎。

在這個過程中發生了四次copy操作。

硬碟->核心->使用者->socket緩沖區(核心)->協定引擎。

而sendfile的工作原理呢??

1、系統調用 sendfile() 通過 DMA 把硬碟資料拷貝到 kernel buffer,然後資料被 kernel 直接拷貝到另外一個與 socket 相關的 kernel buffer。這裡沒有 使用者态和核心态 之間的切換,在核心中直接完成了從一個 buffer 到另一個 buffer 的拷貝。

2、DMA 把資料從 kernel buffer 直接拷貝給協定棧,沒有切換,也不需要資料從使用者态和核心态,因為資料就在 kernel 裡。

———————————————— 

繼續閱讀