成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試題:什么是零拷貝技術?

開發 前端
這是一道高頻的面試題,而且在很多技術中都使用到了,比如javaNIO、kafka、Netty、Linux等等。作為一個非常重要的知識點,而且又是高頻面試題,有必要從零開始好好地認識一下。

[[387261]]

這是一道高頻的面試題,而且在很多技術中都使用到了,比如javaNIO、kafka、Netty、Linux等等。作為一個非常重要的知識點,而且又是高頻面試題,有必要從零開始好好地認識一下。

OK,開始今天的文章。

一、什么是零拷貝?

1、從一個案例說起

為了解釋這個概念,我們先要從一個需求說起,說某天某領導給你下發了一個任務,完成一個從文件中讀取數據,并傳輸到網絡上的一個小程序。代碼很簡單:

首先我們在我們的操作系統中找到這個文件,然后把數據先讀到緩沖區,最后把緩沖區的數據發送到網絡上。

代碼是很簡單,現在我們考慮一下,這個數據從電腦到網絡整個傳輸的過程:

現在我們可以看到1->2->3->4的整個過程一共經歷了四次拷貝的方式,但是真正消耗資源和浪費時間的是第二次和第三次,因為這兩次都需要經過我們的CPU拷貝,而且還需要內核態和用戶態之間的來回切換。想想看,我們的CPU資源是多么寶貴,要處理大量的任務。還要去拷貝大量的數據。如果能把CPU的這兩次拷貝給去除掉,豈不快哉!!!既能節省CPU資源,還可以避免內核態和用戶態之間的切換。

這里還要先說一下用戶態和內核態的區別:

處于用戶態執行時,進程所能訪問的內存空間和對象受到限制,其所處于占有的處理器是可被搶占的

處于內核態執行時,則能訪問所有的內存空間和對象,且所占有的處理器是不允許被搶占的。

2、優化方案

要去除第二次和第三次之間的拷貝,Linux開發人員也早就注意到了這個問題,于是在linux 2.1內核中,添加了 “數據被copy到socket buffer”的動作,于是我們的javaNIO,可以直接調用transferTo()的方法,就可以實現這種現象。

現在一看,感覺性能資源都得到了很大的提升,不過現在還不并不是完美的。因為這三次拷貝還用到了CPU的拷貝技術,就是第二次。不過不要擔心。Linux開發人員比我們更加深謀遠慮。

3、零拷貝優化方案

在Linux2.4 內核做了優化,取而代之的是只包含關于數據的位置和長度的信息的描述符被追加到了socket buffer 緩沖區中。DMA引擎直接把數據從內核緩沖區傳輸到協議引擎(protocol engine),從而消除了最后一次CPU copy。經過上述過程,數據只經過了2次copy就從磁盤傳送出去了。這個才是真正的Zero-Copy

注意:這里的零拷貝其實是根據內核狀態劃分的,在這里沒有經過CPU的拷貝,數據在用戶態的狀態下,經歷了零次拷貝,所以才叫做零拷貝,但不是說不拷貝。

OK。現在我們已經了解了什么是零拷貝技術,下面我們再說一下那些數據結構會用到零拷貝技術。

二、哪些地方會用到零拷貝技術

1、java的NIO

先說java,是因為要給下面的netty做鋪墊,在 Java NIO 中的通道(Channel)就相當于操作系統的內核空間(kernel space)的緩沖區,而緩沖區(Buffer)對應的相當于操作系統的用戶空間(user space)中的用戶緩沖區(user buffer)。

堆外內存(DirectBuffer)在使用后需要應用程序手動回收,而堆內存(HeapBuffer)的數據在 GC 時可能會被自動回收。因此,在使用 HeapBuffer 讀寫數據時,為了避免緩沖區數據因為 GC 而丟失,NIO 會先把 HeapBuffer 內部的數據拷貝到一個臨時的 DirectBuffer 中的本地內存(native memory),這個拷貝涉及到 sun.misc.Unsafe.copyMemory() 的調用,背后的實現原理與 memcpy() 類似。最后,將臨時生成的 DirectBuffer 內部的數據的內存地址傳給 I/O 調用函數,這樣就避免了再去訪問 Java 對象處理 I/O 讀寫。

(1)MappedByteBuffer

MappedByteBuffer 是 NIO 基于內存映射(mmap)這種零拷貝方式的提供的一種實現,意思是把一個文件從 position 位置開始的 size 大小的區域映射為內存映像文件。這樣之添加地址映射,而不進行拷貝。

(2)DirectByteBuffer

DirectByteBuffer 的對象引用位于 Java 內存模型的堆里面,JVM 可以對 DirectByteBuffer 的對象進行內存分配和回收管理,是 MappedByteBuffer 的具體實現類。因此同樣具有零拷貝技術。

(3)FileChannel

FileChannel 定義了 transferFrom() 和 transferTo() 兩個抽象方法,它通過在通道和通道之間建立連接實現數據傳輸的。

我們直接看Linux2.4的版本,socket緩沖區做了調整,DMA帶收集功能。

(1)DMA從拷貝至內核緩沖區

(2)將數據的位置和長度的信息的描述符增加至內核空間(socket緩沖區)

(3)DMA將數據從內核拷貝至協議引擎

這個復制過程是零拷貝過程。

2、Netty

Netty 中的零拷貝和上面提到的操作系統層面上的零拷貝不太一樣, 我們所說的 Netty 零拷貝完全是基于(Java 層面)用戶態的。

(1)Netty 通過 DefaultFileRegion 類對FileChannel 的 tranferTo() 方法進行包裝,相當于是間接的通過java進行零拷貝。

(2)我們的數據傳輸一般都是通過TCP/IP協議實現的,在實際應用中,很有可能一條完整的消息被分割為多個數據包進行網絡傳輸,而單個的數據包對你而言是沒有意義的,只有當這些數據包組成一條完整的消息時你才能做出正確的處理,而Netty可以通過零拷貝的方式將這些數據包組合成一條完整的消息供你來使用。

此時零拷貝的作用范圍僅在用戶空間中。那Netty是如何實現的呢?為此我們就要找到Netty進行數據傳輸的接口,這個接口一定包含了可以實現零拷貝的功能,這個接口就是ChannelBuffer。

既然有接口肯定就有實現類,一個最主要的實現類是CompositeChannelBuffer,這個類的主要作用是將多個ChannelBuffer組成一個虛擬的ChannelBuffer來進行操作

為什么說是虛擬的呢,因為CompositeChannelBuffer并沒有將多個ChannelBuffer真正的組合起來,而只是保存了他們的引用,這樣就避免了數據的拷貝,實現了Zero Copy。

(3)ByteBuf 可以通過 wrap 操作把字節數組、ByteBuf、ByteBuffer 包裝成一個 ByteBuf 對象, 進而避免了拷貝操作

(4)ByteBuf 支持 slice 操作, 因此可以將 ByteBuf 分解為多個共享同一個存儲區域的 ByteBuf,避免了內存的拷貝

3、kafka

Kafka 的索引文件使用的是 mmap + write 方式,數據文件使用的是 sendfile 方式。適用于系統日志消息這種高吞吐量的大塊文件的數據持久化和傳輸。

如果有10個消費者,傳統方式下,數據復制次數為4*10=40次,而使用“零拷貝技術”只需要1+10=11次,一次為從磁盤復制到頁面緩存,10次表示10個消費者各自讀取一次頁面緩存。

OK,先到這里。

本文轉載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉載本文請聯系愚公要移山公眾號。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2023-07-29 13:45:30

了不起 Java極

2024-06-24 00:09:00

零拷貝技術MMapsendFile

2022-05-16 08:22:37

零拷貝Netty

2010-12-29 10:33:51

Oracle

2024-06-07 08:10:14

Netty操作系統零拷貝

2020-06-04 14:40:40

面試題Vue前端

2024-12-04 14:45:14

零拷貝技術CPU 拷貝Zero-copy

2022-05-05 13:57:43

Buffer設備MYSQL

2023-08-26 21:42:08

零拷貝I/O操作

2023-07-27 08:26:36

零拷貝I/O操作

2011-03-24 13:27:37

SQL

2023-11-13 07:37:36

JS面試題線程

2013-11-01 09:27:48

Twitter技術面試

2009-04-17 09:40:04

微軟技術中心面試

2012-08-22 09:32:54

面試面試題

2024-07-24 08:38:07

2014-09-19 11:17:48

面試題

2015-09-02 09:32:56

java線程面試

2009-06-06 18:34:05

java面試題

2009-06-06 18:36:02

java面試題
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线三级 | 一区二区不卡 | 久久日本 | 日韩中文一区二区 | 美女久久久久久久 | 亚洲国产精品久久久久秋霞不卡 | 亚洲444kkkk在线观看最新 | 欧美成人激情 | 一区二区三区在线 | 国产日韩精品久久 | 日韩视频精品在线 | 亚洲综合在线视频 | 精品亚洲一区二区三区四区五区高 | 国产日韩精品久久 | 亚洲成人三级 | 日韩欧美在线观看视频 | 欧美日韩亚洲国产 | 天天操网 | 欧美在线a | 久久久免费 | 精品一二区 | 久久久久资源 | 婷婷91 | av在线免费观看网站 | 自拍偷拍欧美 | 黄a在线播放 | 中文视频在线 | 在线免费观看黄a | 中文字幕福利视频 | 成人国产精品一级毛片视频毛片 | 国产成人在线一区二区 | 国产精品视频一区二区三区不卡 | 中文字幕在线观看视频网站 | 一区二区高清不卡 | 精品影院 | 中文字幕11页 | 在线免费观看成年人视频 | 中文字幕1区| 国产 日韩 欧美 制服 另类 | 中文字幕一区二区三区精彩视频 | 欧美日韩久久 |