日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

美團面試:說說Netty的零拷貝技術?

來源: 責編: 時間:2024-06-07 08:47:50 232觀看
導讀零拷貝技術(Zero-Copy)是一個大家耳熟能詳的技術名詞了,它主要用于提升 IO(Input & Output)的傳輸性能。那么問題來了,為什么零拷貝技術能提升 IO 性能?一、零拷貝技術和性能在傳統的 IO 操作中,當我們需要讀取并傳輸數據時,我

零拷貝技術(Zero-Copy)是一個大家耳熟能詳的技術名詞了,它主要用于提升 IO(Input & Output)的傳輸性能。jOV28資訊網——每日最新資訊28at.com

那么問題來了,為什么零拷貝技術能提升 IO 性能?jOV28資訊網——每日最新資訊28at.com

一、零拷貝技術和性能

在傳統的 IO 操作中,當我們需要讀取并傳輸數據時,我們需要在用戶態(用戶空間)和內核態(內核空間)中進行數據拷貝,它的執行流程如下:jOV28資訊網——每日最新資訊28at.com

圖片圖片jOV28資訊網——每日最新資訊28at.com

從上述流程我們可以看出,在傳統的 IO 操作中,我們是需要 4 次拷貝和 4 次上下文切換(用戶態和內核態的切換)的。jOV28資訊網——每日最新資訊28at.com

而每次數據拷貝和上下文切換都有時間成本,會讓程序的執行時間變成,所以零拷貝技術的出現就是為了減少數據的拷貝次數以及上下文的切換次數的。jOV28資訊網——每日最新資訊28at.com

1.1 什么是用戶態和內核態?

操作系統有用戶態和內核態之分,這是因為計算機體系結構中的操作系統設計了兩個不同的執行環境,以提供不同的功能和特權級別。jOV28資訊網——每日最新資訊28at.com

  • 用戶態(User Mode)是指應用程序運行時的執行環境。在用戶態下,應用程序只能訪問受限資源,如應用程序自身的內存空間、CPU 寄存器等,并且不能直接訪問操作系統的底層資源和硬件設備。
  • 內核態(Kernel Mode)是指操作系統內核運行時的執行環境。在內核態下,操作系統具有更高的權限,可以直接訪問系統的硬件和底層資源,如 CPU、內存、設備驅動程序等。

1.2 什么是DMA?

DMA(Direct Memory Access,直接內存訪問)技術,繞過 CPU,直接在內存和外設之間進行數據傳輸。這樣可以減少 CPU 的參與,提高數據傳輸的效率。jOV28資訊網——每日最新資訊28at.com

二、Linux零拷貝技術

Linux 下實現零拷貝的主要實現技術是 MMap、sendFile,它們的具體介紹如下。jOV28資訊網——每日最新資訊28at.com

2.1 MMap

MMap(Memory Map)是 Linux 操作系統中提供的一種將文件映射到進程地址空間的一種機制,通過 MMap 進程可以像訪問內存一樣訪問文件,而無需顯式的復制操作。jOV28資訊網——每日最新資訊28at.com

使用 MMap 可以把 IO 執行流程優化成以下執行步驟:jOV28資訊網——每日最新資訊28at.com

圖片圖片jOV28資訊網——每日最新資訊28at.com

傳統的 IO 需要四次拷貝和四次上下文(用戶態和內核態)切換,而 MMap 只需要三次拷貝和四次上下文切換,從而能夠提升程序整體的執行效率,并且節省了程序的內存空間。jOV28資訊網——每日最新資訊28at.com

2.2 senFile 方法

在 Linux 操作系統中 sendFile() 是一個系統調用函數,用于高效地將文件數據從內核空間直接傳輸到網絡套接字(Socket)上,從而實現零拷貝技術。這個函數的主要目的是減少 CPU 上下文切換以及內存復制操作,提高文件傳輸性能。jOV28資訊網——每日最新資訊28at.com

使用 sendFile() 可以把 IO 執行流程優化成以下執行步驟:jOV28資訊網——每日最新資訊28at.com

圖片圖片jOV28資訊網——每日最新資訊28at.com

三、Netty零拷貝技術

Netty 中的零拷貝和傳統 Linux 的零拷貝技術的實現不太一樣,Netty 中的零拷貝技術主要是通過優化用戶態的操作來提升 IO 的執行速度,從而實現零拷貝的。jOV28資訊網——每日最新資訊28at.com

PS:所有可以提升 IO 執行效率的操作或手段都可以稱之為零拷貝技術。jOV28資訊網——每日最新資訊28at.com

Netty 中的零拷貝技術主要有以下 5 種實現:jOV28資訊網——每日最新資訊28at.com

  1. 使用堆外內存:避免 JVM 堆內存到堆外內存的數據拷貝,從而提升了 IO 的操作性能。
  2. 使用 CompositeByteBuf 合并對象:可以組合多個 Buffer 對象合并成一個邏輯上的對象,避免通過傳統內存拷貝的方式將幾個 Buffer 合并成一個大的 Buffer。
  3. 通過 Unpooled.wrappedBuffer 合并數據:可以將 byte 數組包裝成 ByteBuf 對象,包裝過程中不會產生內存拷貝。
  4. 使用 ByteBuf.slice 共享對象:操作與 Unpooled.wrappedBuffer 相反,slice 操作可以將一個 ByteBuf 對象切分成多個 ByteBuf 對象,切分過程中不會產生內存拷貝,底層共享一個 byte 數組的存儲空間。
  5. 使用 FileRegion 實現零拷貝:FileRegion 底層封裝了 FileChannel#transferTo() 方法,可以將文件緩沖區的數據直接傳輸到目標 Channel,避免內核緩沖區和用戶態緩沖區之間的數據拷貝,這屬于操作系統級別的零拷貝。

它們的具體實現如下。jOV28資訊網——每日最新資訊28at.com

3.1 使用堆外內存

正常情況下,JVM 需要將數據從 JVM 堆內存拷貝到堆外內存進行業務執行的,這是因為:jOV28資訊網——每日最新資訊28at.com

  1. 操作系統并不感知 JVM 的堆內存,而且 JVM 的內存布局與操作系統所分配的是不一樣的,操作系統并不會按照 JVM 的行為來讀寫數據。
  2. 同一個對象的內存地址隨著 JVM GC 的執行可能會隨時發生變化,例如 JVM GC 的過程中會通過壓縮來減少內存碎片,這就涉及對象移動的問題了。

而 Netty 在進行 I/O 操作時都是使用的堆外內存,可以避免數據從 JVM 堆內存到堆外內存的拷貝。jOV28資訊網——每日最新資訊28at.com

3.2 使用CompositeByteBuf合并對象

CompositeByteBuf 可以理解為一個虛擬的 Buffer 對象,它是由多個 ByteBuf 組合而成,但是在 CompositeByteBuf 內部保存著每個 ByteBuf 的引用關系,從邏輯上構成一個整體。使用 CompositeByteBuf 我們可以合并兩個 ByteBuf 對象,從而避免兩個對象合并時需要兩次 CPU 拷貝操作的問題,在沒有使用 CompositeByteBuf 時,我們的操作是這樣的:jOV28資訊網——每日最新資訊28at.com

ByteBuf httpBuf = Unpooled.buffer(header.readableBytes() + body.readableBytes());httpBuf.writeBytes(header);httpBuf.writeBytes(body);

而實現 header 和 body 這兩個 ByteBuf 的合并,需要先初始化一個新的 httpBuf,然后再將 header 和 body 分別拷貝到新的 httpBuf。合并過程中涉及兩次 CPU 拷貝,這非常浪費性能,所以我們就可以使用 CompositeByteBuf 了,它的使用如下:jOV28資訊網——每日最新資訊28at.com

CompositeByteBuf httpBuf = Unpooled.compositeBuffer();httpBuf.addComponents(true, header, body);

CompositeByteBuf 通過調用 addComponents() 方法來添加多個 ByteBuf,但是底層的 byte 數組是復用的,不會發生內存拷貝。jOV28資訊網——每日最新資訊28at.com

3.3 通過Unpooled.wrappedBuffer合并數據

Unpooled.wrappedBuffer 的操作類似,使用它可以將不同的數據源的一個或者多個數據包裝成一個大的 ByteBuf 對象,其中數據源的類型包括 byte[]、ByteBuf、ByteBuffer。包裝的過程中不會發生數據拷貝操作,包裝后生成的 ByteBuf 對象和原始 ByteBuf 對象是共享底層的 byte 數組。jOV28資訊網——每日最新資訊28at.com

3.4 使用 ByteBuf.slice 共享對象

ByteBuf.slice 和 Unpooled.wrappedBuffer 的邏輯正好相反,ByteBuf.slice 是將一個 ByteBuf 對象切分成多個共享同一個底層存儲的 ByteBuf 對象,從而避免對象分割時的數據拷貝,它的使用如下:jOV28資訊網——每日最新資訊28at.com

ByteBuf httpBuf = ...ByteBuf header = httpBuf.slice(0, 6);ByteBuf body = httpBuf.slice(6, 4);

3.5 使用 FileRegion 實現文件零拷貝

FileRegion 底層封裝了 FileChannel#transferTo() 方法,可以將文件緩沖區的數據直接傳輸到目標 Channel,避免內核緩沖區和用戶態緩沖區之間的數據拷貝,這屬于操作系統級別的零拷貝。jOV28資訊網——每日最新資訊28at.com

以下是 FileRegion 的默認實現類 DefaultFileRegion 的使用案例:jOV28資訊網——每日最新資訊28at.com

@Overridepublic void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {    RandomAccessFile raf = null;    long length = -1;    try {        raf = new RandomAccessFile(msg, "r");        length = raf.length();    } catch (Exception e) {        ctx.writeAndFlush("ERR: " + e.getClass().getSimpleName() + ": " + e.getMessage() + '/n');        return;    } finally {        if (length < 0 && raf != null) {            raf.close();        }    }    ctx.write("OK: " + raf.length() + '/n');    if (ctx.pipeline().get(SslHandler.class) == null) {        // SSL not enabled - can use zero-copy file transfer.        ctx.write(new DefaultFileRegion(raf.getChannel(), 0, length));    } else {        // SSL enabled - cannot use zero-copy file transfer.        ctx.write(new ChunkedFile(raf));    }    ctx.writeAndFlush("/n");}

從上述代碼可以看出,可以通過 DefaultFileRegion 將文件內容直接寫入到 NioSocketChannel 中,從而避免了內核緩沖區和用戶態緩沖區之間的數據拷貝。jOV28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-92592-0.html美團面試:說說Netty的零拷貝技術?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: JavaScript 奇葩行為大賞

下一篇: 使用Rust開發的區塊鏈(Solana)與Socket.IO進行實時無人機數據傳輸

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
性色一区二区三区| 中文在线不卡| 樱桃成人精品视频在线播放| 亚洲电影免费| 一区二区欧美激情| 亚洲欧美大片| 久久尤物电影视频在线观看| 欧美精品在欧美一区二区少妇| 国产精品第13页| 激情国产一区| 亚洲免费播放| 欧美在线看片| 欧美理论电影在线播放| 国产精品视频免费| 亚洲国产欧美久久| 亚洲欧美视频在线观看| 欧美成ee人免费视频| 国产精品一区二区久久久久| 亚洲成色777777在线观看影院| 亚洲一区二区黄| 久久综合九色99| 国产精品v日韩精品v欧美精品网站| 国产一区二区三区自拍| 日韩一级黄色av| 久久精品导航| 欧美视频你懂的| 一色屋精品视频在线观看网站 | 一区二区欧美日韩视频| 欧美一级欧美一级在线播放| 欧美成在线观看| 国产欧美精品一区aⅴ影院| 亚洲精品在线视频| 久久成人免费| 欧美视频观看一区| 在线观看成人一级片| 亚洲在线成人精品| 欧美国产在线电影| 国内精品伊人久久久久av一坑| 在线一区欧美| 欧美激情精品久久久久| 狠狠色狠狠色综合人人| 亚洲欧美不卡| 欧美日韩国产黄| 在线观看成人av| 欧美一区亚洲一区| 国产精品久久久久影院色老大| 亚洲精品视频免费在线观看| 久久夜色精品国产噜噜av| 国产日韩欧美在线看| 一区二区三区久久久| 欧美成人精品激情在线观看| 国内综合精品午夜久久资源| 亚洲欧美视频在线| 欧美三级小说| 亚洲美女视频在线观看| 美女脱光内衣内裤视频久久影院 | 欧美欧美天天天天操| 亚洲成色精品| 久久免费精品日本久久中文字幕| 国产精品资源在线观看| 亚洲天堂成人| 欧美日韩亚洲三区| 亚洲伦伦在线| 欧美精品色综合| 91久久国产综合久久| 女生裸体视频一区二区三区 | 欧美一区二区免费| 国产精品久久久久永久免费观看| 一区二区三区欧美| 欧美日韩午夜剧场| 亚洲美女av黄| 欧美日韩国产大片| 99国产精品久久久| 欧美三级视频| 亚洲午夜激情在线| 国产精品swag| 亚洲性夜色噜噜噜7777| 欧美午夜精彩| 亚洲视频在线观看免费| 国产精品s色| 亚洲一区国产视频| 国产精品一卡二卡| 欧美一区二区三区四区在线| 国产伪娘ts一区 | 国产欧美日韩三级| 久久精品论坛| 在线成人亚洲| 欧美搞黄网站| 一区二区激情小说| 国产精品久久久久aaaa| 午夜一区在线| 国产在线视频不卡二| 久久人人爽人人| 亚洲成人资源网| 欧美夫妇交换俱乐部在线观看| 亚洲欧洲一区二区三区久久| 欧美日本免费一区二区三区| 一本色道久久加勒比88综合| 国产精品chinese| 午夜久久久久| 国内精品久久久久影院优| 免费国产自线拍一欧美视频| 亚洲精品乱码久久久久久久久 | 欧美华人在线视频| 在线视频精品| 国产美女精品人人做人人爽| 久久久久久成人| 亚洲肉体裸体xxxx137| 国产精品国产自产拍高清av王其| 欧美亚洲一区在线| 国产一区二区三区高清| 欧美 日韩 国产 一区| 在线视频一区观看| 国产亚洲一区二区三区| 欧美 日韩 国产一区二区在线视频 | 欧美成人伊人久久综合网| 99re8这里有精品热视频免费| 欧美丝袜一区二区| 欧美综合激情网| 91久久久亚洲精品| 国产精品黄色在线观看| 久久精品国产2020观看福利| 亚洲激情成人网| 国产精品日韩欧美大师| 美女精品自拍一二三四| 一区二区冒白浆视频| 国产视频一区在线观看| 欧美国产欧美综合| 欧美一级二区| 亚洲精品欧美精品| 国产欧美一区二区三区国产幕精品| 久久综合色8888| 亚洲性xxxx| 亚洲承认在线| 国产精品亚洲综合色区韩国| 欧美成年人视频| 欧美一级片一区| 亚洲精品小视频| 国模 一区 二区 三区| 欧美少妇一区| 裸体女人亚洲精品一区| 亚洲欧美视频一区| 亚洲毛片一区| 狠狠久久婷婷| 国产精品久久午夜| 欧美成人dvd在线视频| 午夜日韩激情| 99热精品在线观看| 极品尤物久久久av免费看| 国产精品v亚洲精品v日韩精品| 久久亚洲视频| 午夜在线视频观看日韩17c| 亚洲毛片av| 亚洲大片在线| 国产欧美精品一区二区色综合| 欧美日本中文| 卡一卡二国产精品| 午夜免费日韩视频| 99视频+国产日韩欧美| 在线观看国产精品网站| 国产日韩久久| 国产精品萝li| 欧美日韩在线精品| 欧美激情2020午夜免费观看| 久久久久久久久蜜桃| 亚洲欧美日韩在线高清直播| 日韩天堂在线观看| 亚洲成色777777女色窝| 国产在线播精品第三| 国产精品区免费视频| 欧美日韩国产在线观看| 欧美sm极限捆绑bd| 久久青青草原一区二区| 午夜日本精品| 一本色道久久综合亚洲精品不| 亚洲黄色免费电影| 在线国产日韩| 伊伊综合在线| 国内外成人在线| 国产日韩欧美不卡| 国产麻豆精品视频| 国产精品高精视频免费| 欧美日韩亚洲高清| 欧美激情亚洲精品| 欧美.www| 牛人盗摄一区二区三区视频| 久久综合给合久久狠狠狠97色69| 欧美在线免费播放| 欧美一区二区三区视频| 西西裸体人体做爰大胆久久久| 亚洲一区二区免费| 亚洲综合三区| 香蕉久久国产| 欧美中文在线免费| 欧美在线视频全部完| 久久不见久久见免费视频1| 欧美一区二区三区日韩视频| 午夜精品久久| 午夜日本精品| 久久精品动漫| 久久久久99| 美女91精品| 欧美电影免费观看网站| 欧美精品激情|