比較好的文章:
所謂零拷貝,指的是應用記憶體與核心記憶體不存在拷貝。
對應零拷貝技術有mmap及sendfile。
一.mmap優點:
小檔案傳輸快,需要四次使用者態與核心態的切換。檔案到核心快取,核心快取到socket buffer,socket buffer到網絡卡記憶體。cpu介入多,使用者態與核心態切換多。
分成兩個階段,
階段一:呼叫map方法,建立使用者程序與核心記憶體的對映,對映範圍是某個檔案。這個是阻塞的。
階段二:呼叫write方法,將之前建立的對映,寫到socket。
階段二可以設計成nio形式。實現就是將要寫的內容封裝成訊息發給io執行緒。io執行緒非同步去做。這方面netty框架就是這麼做的。
二.sendfile優點:
大檔案傳輸比mmap快,原因是只存在二次使用者態與核心態的切換。並且之後少了核心快取到socket buffer的拷貝。
分成乙個階段:
傳送者阻塞呼叫sendfile方法,sendfile(socket, file, len);
接著會完成file到核心快取,核心快取拷貝個訊息在核心快取的位址到socket buffer。然後dma從socket buffer指示的核心快取拷貝資料到網絡卡記憶體。
這裡分成乙個階段,優點很明顯少了使用者態與核心態切換,及核心到socket buffer的拷貝,並且相應的cpu介入少了。但缺點也是因為這個原因,導致不能nio進行訊息傳送。
原文:
深入剖析零拷貝與順序寫
這篇文章我們來學習下經常出現在各種資料庫與中介軟體設計中的零拷貝和順序寫.零拷貝技術就是在檔案傳輸時,減少cpu執行的資料拷貝次數.那如何減少資料的拷貝次數呢?我們來學習下在不同linux核心版本中檔案傳輸的過程.kernel1.0版本 檔案傳輸 read file,tmp buf,len writ...
深入JavaScript中深拷貝和淺拷貝
深拷貝和淺拷貝問題的本質還是不同資料型別的儲存方式差異,尤其是引用資料型別的特殊。現分別對賦值 淺拷貝 深拷貝做深入研究 1.賦值 原理 直接將物件指標直接賦值給另乙個變數 let developer frameworks react vue angularjs summary function l...
零拷貝問題
零拷貝 定義 避免cpu將資料從一塊儲存空間拷貝到另乙個儲存空間的技術。通常用於網路檔案傳輸 以減少cpu消耗和記憶體頻寬的占用 減少使用者空間 使用者可操作的記憶體快取區域 和cpu核心空間 cpu核心可操作的記憶體快取和暫存器快取 的拷貝過程,減少使用者上下文和cpu核心上下文的切換,讓cpu解...