多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > 框架設(shè)計(jì) > 什么是Zero-Copy?

什么是Zero-Copy?

來源:程序員人生   發(fā)布時(shí)間:2016-11-21 09:03:52 閱讀次數(shù):4555次

概述

斟酌這樣1種經(jīng)常使用的情形:你需要將靜態(tài)內(nèi)容(類似圖片、文件)展現(xiàn)給用戶。那末這個(gè)情形就意味著你需要先將靜態(tài)內(nèi)容從磁盤中拷貝出來放到1個(gè)內(nèi)存buf中,然后將這個(gè)buf通過socket傳輸給用戶,進(jìn)而用戶或靜態(tài)內(nèi)容的展現(xiàn)。這看起來再正常不過了,但是實(shí)際上這是很低效的流程,我們把上面的這類情形抽象成下面的進(jìn)程:

read(file, tmp_buf, len); write(socket, tmp_buf, len);

首先調(diào)用read將靜態(tài)內(nèi)容,這里假定為文件A,讀取到tmp_buf, 然后調(diào)用write將tmp_buf寫入到socket中,如圖:

[圖片]
在這個(gè)進(jìn)程中文件A的經(jīng)歷了4次copy的進(jìn)程:

  1. 首先,調(diào)用read時(shí),文件A拷貝到了kernel模式;
  2. 以后,CPU控制將kernel模式數(shù)據(jù)copy到user模式下;
  3. 調(diào)用write時(shí),先將user模式下的內(nèi)容copy到kernel模式下的socket的buffer中;
  4. 最后將kernel模式下的socket buffer的數(shù)據(jù)copy到網(wǎng)卡裝備中傳送;

從上面的進(jìn)程可以看出,數(shù)據(jù)白白從kernel模式到user模式走了1圈,浪費(fèi)了2次copy(第1次,從kernel模式拷貝到user模式;第2次從user模式再拷貝回kernel模式,即上面4次進(jìn)程的第2和3步驟。)。而且上面的進(jìn)程中kernel和user模式的上下文的切換也是4次。

榮幸的是,你可以用1種叫做Zero-Copy的技術(shù)來去掉這些無謂的copy。利用程序用Zero-Copy來要求kernel直接把disk的data傳輸給socket,而不是通過利用程序傳輸。Zero-Copy大大提高了利用程序的性能,并且減少了kernel和user模式上下文的切換。


詳述

Zero-Copy技術(shù)省去了將操作系統(tǒng)的read buffer拷貝到程序的buffer,和從程序buffer拷貝到socket buffer的步驟,直接將read buffer拷貝到socket buffer. Java NIO中的FileChannal.transferTo()方法就是這樣的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)是依賴于操作系統(tǒng)底層的sendFile()實(shí)現(xiàn)的。

public void transferTo(long position, long count, WritableByteChannel target);

他底層的調(diào)用時(shí)系統(tǒng)調(diào)用sendFile()方法:

#include <sys/socket.h> ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

下圖展現(xiàn)了在transferTo()以后的數(shù)據(jù)流向:
[圖片]

下圖展現(xiàn)了在使用transferTo()以后的上下文切換:
[圖片]

使用了Zero-Copy技術(shù)以后,全部進(jìn)程以下:

  1. transferTo()方法使得文件A的內(nèi)容直接拷貝到1個(gè)read buffer(kernel buffer)中;
  2. 然后數(shù)據(jù)(kernel buffer)拷貝到socket buffer中。
  3. 最后將socket buffer中的數(shù)據(jù)拷貝到網(wǎng)卡裝備(protocol engine)中傳輸;
    這明顯是1個(gè)偉大的進(jìn)步:這里把上下文的切換次數(shù)從4次減少到2次,同時(shí)也把數(shù)據(jù)copy的次數(shù)從4次下降到了3次。

但是這是Zero-Copy么,答案是不是定的。


進(jìn)階

Linux 2.1內(nèi)核開始引入了sendfile函數(shù)(上1節(jié)有提到),用于將文件通過socket傳送。

sendfile(socket, file, len);

該函數(shù)通過1次系統(tǒng)調(diào)用完成了文件的傳送,減少了原來read/write方式的模式切換。另外更是減少了數(shù)據(jù)的copy, sendfile的詳細(xì)進(jìn)程如圖:
[圖片]
通過sendfile傳送文件只需要1次系統(tǒng)調(diào)用,當(dāng)調(diào)用sendfile時(shí):

  1. 首先(通過DMA)將數(shù)據(jù)從磁盤讀取到kernel buffer中;
  2. 然后將kernel buffer拷貝到socket buffer中;
  3. 最后將socket buffer中的數(shù)據(jù)copy到網(wǎng)卡裝備(protocol engine)中發(fā)送;

這個(gè)進(jìn)程就是第2節(jié)(詳述)中的那個(gè)步驟。

sendfiel與read/write模式相比,少了1次copy。但是從上述進(jìn)程中也能夠發(fā)現(xiàn)從kernel buffer中將數(shù)據(jù)copy到socket buffer是沒有必要的。

Linux2.4 內(nèi)核對(duì)sendfile做了改進(jìn),如圖:
[圖片]

改進(jìn)后的處理進(jìn)程以下:

  1. 將文件拷貝到kernel buffer中;
  2. 向socket buffer中追加當(dāng)前要產(chǎn)生的數(shù)據(jù)在kernel buffer中的位置和偏移量;
  3. 根據(jù)socket buffer中的位置和偏移量直接將kernel buffer的數(shù)據(jù)copy到網(wǎng)卡裝備(protocol engine)中;

經(jīng)過上述進(jìn)程,數(shù)據(jù)只經(jīng)過了2次copy就從磁盤傳送出去了。
這個(gè)才是真實(shí)的Zero-Copy(這里的零拷貝是針對(duì)kernel來說的,數(shù)據(jù)在kernel模式下是Zero-Copy)。

正是Linux2.4的內(nèi)核做了改進(jìn),Java中的TransferTo()實(shí)現(xiàn)了Zero-Copy,以下圖:
這里寫圖片描述

Zero-Copy技術(shù)的使用處景有很多,比如Kafka, 又或是Netty等,可以大大提升程序的性能。


參考資料

  1. Zero-Copy&sendfile淺析
  2. Efficient data transfer through zero copy
  3. Kafka Zero-Copy 使用分析
  4. 理解Netty中的零拷貝(Zero-Copy)機(jī)制
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产欧美日韩一区 | 国产福利观看 | 亚洲精品久久久久久久网站 | 国产精品久久久久久久久免费hd | ck7788免费视频 | 免费网站成人亚洲 | 亚洲欧美视频在线播放 | 国产永久在线视频 | 国产午夜免费一区二区三区 | 男女午夜爽爽大片免费 | 最近的中文字幕免费完整 | 欧美做爰gif动态图一区二区 | 一区二区三区四区亚洲 | 一级做a爰片欧美一区 | 亚洲一区二区三区四区 | 男人把大ji巴放进男人免费视频 | 一区二区三区观看 | 欧美日本在线一区二区三区 | 亚洲毛片在线观看 | 自拍偷拍亚洲 | 国产成人精品区在线观看 | 中文无码日韩欧免费视频 | 国产精品久久亚洲一区二区 | 国产精品欧美日韩一区二区 | 欧美日韩国产精品va | 精品亚洲在线 | 午夜dj在线观看免费高清视频在线观看 | 最近免费中文字幕视频高清在线看 | 日本黄大乳片免费观看 | 日本特黄一级大片 | 三浦惠理子中文字幕在线一区二区 | 春色激情站 | 黑人性hd| 美国一级毛片视频 | 成 人国产在线观看高清不卡 | 欧美精品久久久久久久小说 | 亚洲黄色中文字幕 | 曰本一区二区三区 | 国产精品久久久久久久久久免费 | 精品日韩一区二区三区 | 欧美三级视频 |