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 裡。
————————————————