1. 程式人生 > 實用技巧 >Linux 零拷貝技術

Linux 零拷貝技術

減少拷貝次數的一種方法是呼叫mmap()來代替read呼叫,呼叫mmap(),核心會把資料通過DMA拷貝到核心緩衝區,然後不發往使用者空間,而是直接將資料拷貝到socket緩衝區或者其他硬碟緩衝區。原本資料從硬碟傳送到網絡卡需要經過四次上下文切換和四次資料拷貝——從硬碟到核心緩衝區,從核心緩衝區到使用者空間,從使用者空間到核心緩衝區,從核心緩衝區到socket緩衝區。使用mmap後需要經過相同過的四次上下文切換和三次資料拷貝,但是mmap呼叫返回時資料不再從核心拷貝到使用者空間,少了一次記憶體拷貝。零拷貝技術是使用虛擬記憶體技術實現的實體記憶體共享機制。

系統呼叫sendfile()在代表輸入檔案的描述符in_fd
和代表輸出檔案的描述符out_fd之間傳送檔案內容(位元組)。描述符out_fd必須指向一個套接字,而in_fd指向的檔案必須是可以mmap的。這些侷限限制了sendfile的使用,使sendfile只能將資料從檔案傳遞到套接字上,反之則不行。
使用sendfile不僅減少了資料拷貝的次數,還減少了上下文切換,資料傳送始終只發生在kernel space