在學習sendfille之前,我們先來了解一下瀏覽器訪問頁面時,後台伺服器的大致工作流程。
下圖是從使用者訪問某個頁面到頁面的顯示這幾秒鐘的時間當中,在後台的整個工作過程。
如上圖,黑色箭頭所示的過程,是傳統方式的資料傳輸:
第一步:當使用者請求www.test.com/index.html網頁時,nginx伺服器通過網絡卡接收到請求後,系統呼叫read導致了從使用者空間到核心空間的上下文切換,核心再向磁碟傳送關於index.html的請求,dma模組從磁碟中讀取index.html(以下簡稱為資料)傳送到核心緩衝區,完成第一次複製。
第二步:系統呼叫read返回,導致從核心空間到使用者空間的上下文切換,此時資料已存放在使用者緩衝區中,完成第二次複製。
這裡的複製操作均由dma模組來執行完成。
了解了這個過程後,我們來看一下sendfile和mmap到底是什麼?
它的目的也是提公升資料的傳輸效能
如上圖中的紅色箭頭,sendfile機制實際上就是節省了從核心空間到使用者空間,再從使用者空間到核心空間這個往返的過程,相比於傳統的方式節省了一次資料的複製,提高了訪問效率。它的大致步驟是:
第一步:從磁碟到核心空間,完成第一次複製。
自核心版本號2.1,引進了sendfile2.4之後,sendfile實現了更簡單的方式,不同之處在於,檔案到達核心緩衝區後,不必再將資料全部複製到socket buffer緩衝區,而只將記錄資料位置和長度相關的資料儲存到socket buffer,而資料實際由dma模組直接傳送給協議相關引擎,再次降低了複製操作。
就是在使用者的虛擬位址空間中尋找空閒的一段位址進行對檔案的操作,不必再呼叫read、write系統呼叫,它的最終目的是將磁碟中的檔案對映到使用者程序的虛擬位址空間,實現使用者程序對檔案的直接讀寫,減少了檔案複製的開銷,提高了使用者的訪問效率。
如有錯誤,敬請指正~~
sendfile函式 零拷貝
零拷貝 零拷貝技術可以減少資料拷貝和共享匯流排操作的次數,消除通訊資料在儲存器之間不必要的中間拷貝過程,有效地提高通訊效率,是設計高速介面通道 實現高速伺服器和路由器的關鍵技術之一。sendfile include ssize t sendfile int out fd,int in fd,off ...
sendfile 實現零拷貝詳解
2013年11月18日 11 17 供稿中心 網際網路運營部 摘要 linux的sendfile 系統呼叫 伺服器響應乙個http請求的步驟如下 1 把磁碟檔案讀入核心緩衝區 2 從核心緩衝區讀到記憶體 3 處理 靜態資源不需處理 4 傳送到網絡卡的核心緩衝區 傳送快取 5 網絡卡傳送資料 資料從第...
sendfile「零拷貝」和mmap記憶體對映
在學習sendfille之前,我們先來了解一下瀏覽器訪問頁面時,後台伺服器的大致工作流程。下圖是從使用者訪問某個頁面到頁面的顯示這幾秒鐘的時間當中,在後台的整個工作過程。如上圖,黑色箭頭所示的過程,是傳統方式的資料傳輸 第一步 當使用者請求www.test.com index.html網頁時,ngi...