Zero-Copy

服務器將硬盤上的文件,傳給用戶,需要幾次拷貝?
解決這個問題,需要明白具體的工作流程是什么?

read(file, buf, len);        // 把文件讀到緩沖區(qū)buf中
write(socket, buf, len);  // 把buf中的內容發(fā)送給用戶

關于哪個步驟需要拷貝:

  1. 把磁盤中文件拷貝到kernel buf
  2. 把kernel buf拷貝到user buf
  3. 把user buf拷貝到socket 中的kernel buf
  4. 把socket buffer 拷貝到 網(wǎng)卡設備的buffer
    其實1,2是read,3,4是write
    所以說,一共拷貝4次,而且kernel mod和user mod的切換也是4次。

Linux 2.1內核開始引入了sendfile函數(shù)。省去了將操作系統(tǒng)的read buffer拷貝到程序的buffer,以及從程序buffer拷貝到socket buffer的步驟
而是直接將kernel buf 拷貝 到 socket buf。 實際上是把2,3兩部步驟整合了。


拷貝次數(shù)

上下文切換

這里把上下文的切換次數(shù)從4次減少到2次,同時也把數(shù)據(jù)copy的次數(shù)從4次降低到了3次。
Java NIO中的FileChannal.transferTo()方法就是這樣的實現(xiàn),這個實現(xiàn)是依賴于操作系統(tǒng)底層的sendFile()實現(xiàn)的
但是,這還不是Zero-Copy。

  1. 將文件拷貝到kernel buffer中
  2. 向socket buf中寫入當前要拷貝數(shù)據(jù)的位置和偏移量
  3. 根據(jù)socket buf中的位置和偏移量,直接將kernel buf拷貝到網(wǎng)卡buffer中。


這樣只需要拷貝兩次。這里的零拷貝是針對kernel來講的,數(shù)據(jù)在kernel模式下是Zero-Copy。

在kafka和netty中會使用到Zero-Copy,大大提升了性能。

感謝:什么是Zero-Copy?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載:原文鏈接 考慮這樣一種常用的情形:你需要將靜態(tài)內容(類似圖片、文件)展示給用戶。那么這個情形就意味著你需要先...
    SnailFast閱讀 600評論 0 2
  • 單獨從理論上理解可能會有些晦澀,我在這從一個實際的場景進行闡述,一步一步演進Zero-Copy的原理。 概述 我們...
    Yang0503閱讀 1,184評論 0 1
  • ??本文專門解釋關于高性能IO的基層技術,關于zero-copy,mmap,direct-memory,這些都是L...
    Skymiles閱讀 4,955評論 4 10
  • 場景: 從本地磁盤讀取數(shù)據(jù),然后將這些數(shù)據(jù)通過socket發(fā)送到遠端。 read(file, user_buf, ...
    一只搬磚的傻狗閱讀 619評論 0 0
  • 目錄 前言 傳統(tǒng)的數(shù)據(jù)傳輸方法 零拷貝的數(shù)據(jù)傳輸方法“基礎的”零拷貝機制對Scatter/Gather的支持對內存...
    LittleMagic閱讀 38,404評論 14 86

友情鏈接更多精彩內容