Zero Copy 學習總結
定義
零複製(英語:Zero-copy;也譯零複製)技術是指計算機執行操作時,CPU不需要先將資料從某處記憶體複製到另一個特定區域。這種技術通常用於透過網路傳輸檔案時節省CPU週期和記憶體頻寬。
傳統IO讀寫方式
在讀取檔案資料,然後傳送到網路的這個場景中,傳統IO讀寫方式的過程如下。
由圖可知,整個過程總共發生了 4 次複製和 4 次使用者態和核心態的切換。其中:
-
把磁碟中檔案複製到kernel buf
-
把kernel buf複製到user buf
-
把user buf複製到socket 中的kernel buf
-
把socket buffer 複製到網路卡裝置的buffer
所以說,一共複製4次,而且kernel mod和user mod的切換也是4次。使用者態和核心態的切換如下。借個網上的圖。
zero copy技術
減少不必要的核心緩衝區跟使用者緩衝區間的複製,從而減少CPU的開銷和核心態切換開銷,達到效能的提升。
transferTo()方法使得磁碟檔案的資料,首先被直接複製到一個read buffer(kernel buffer)中,然後 kernel buffer 的資料複製到 socket buffer 中,最後將 socket buffer 中的資料複製到網路卡裝置(protocol engine)中進行傳輸。
zero copy下,同樣的讀取檔案然後透過網路傳送出去,只需要複製 3 次,核心態和使用者態的切換從原來的4次減少為2次。
Linux2.4 核心對sendfile做了改進,如圖:
改進後,執行步驟如下:
- 將檔案複製到kernel buffer中;
- 向socket buf中寫入當前要複製資料在 kernel buffer 中的位置和偏移量;
-
根據socket buffer中的位置和偏移量,直接將kernel buffer的資料複製到網路卡protocol buffer中。
經過上述過程,資料只經過了2次copy就從磁碟傳送出去了。這才是真正的Zero-Copy(
這裡的零複製是針對kernel來講的,資料在kernel模式下是Zero-Copy
)。
正是因為 Linux2.4 的核心做了改進,Java中的TransferTo()才實現了真正的 Zero-Copy,如下圖:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-2671693/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 學習總結
- 高效能IO-零拷貝(zero copy)
- MYSQL學習總結MySql
- 近期學習總結
- KUDU學習總結
- CompletableFuture學習總結
- SpringCloud 學習總結SpringGCCloud
- awk 學習總結
- MyBatis 學習總結MyBatis
- Maven學習總結Maven
- Ajax學習總結
- JVM學習總結JVM
- mysqlimport學習總結MySqlImport
- WorkFlow學習總結
- JNI 學習總結
- SVG學習總結SVG
- 【TS】學習總結
- Kafka 總結學習Kafka
- Typescript學習總結TypeScript
- python學習總結Python
- Oracle學習總結Oracle
- redis學習總結Redis
- ConstraintLayout 學習總結AI
- BOM學習總結
- tkinter學習總結
- vue學習總結Vue
- HSF學習總結
- HTML學習總結HTML
- Mybatis學習總結MyBatis
- JavaWeb學習總結JavaWeb
- ElasticSearch 學習總結Elasticsearch
- Storm學習總結ORM
- vue 學習總結Vue
- lua 學習總結
- Angularjs 學習總結AngularJS
- WebRTC學習總結Web
- GCD 學習總結GC
- pandas 學習總結