自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

什么是零拷貝,Netty是如何實(shí)現(xiàn)的?

開發(fā) 前端
在計(jì)算機(jī)中,完成數(shù)據(jù)傳輸,要么是通過(guò)網(wǎng)絡(luò),要么就是通過(guò)本地磁盤。通常完成一次完整I/O交互流程分為兩階段,首先拷貝到系統(tǒng)內(nèi)核空間,由操作系統(tǒng)來(lái)完成;緊接著要拷貝到用戶空間,這個(gè)由應(yīng)用程序來(lái)完成。

作為一個(gè)高性能的網(wǎng)絡(luò)通信框架,被越來(lái)越多互聯(lián)網(wǎng)公司關(guān)注和重視。最近,有小伙伴在面試過(guò)程中被問(wèn)到Netty是如何實(shí)現(xiàn)零拷貝的問(wèn)題?,今天,我給大家來(lái)聊一聊。

我們先來(lái)看什么是零拷貝?

1、什么零拷貝

在計(jì)算機(jī)中,完成數(shù)據(jù)傳輸,要么是通過(guò)網(wǎng)絡(luò),要么就是通過(guò)本地磁盤。通常完成一次完整I/O交互流程分為兩階段,首先拷貝到系統(tǒng)內(nèi)核空間,由操作系統(tǒng)來(lái)完成;緊接著要拷貝到用戶空間,這個(gè)由應(yīng)用程序來(lái)完成,具體交互流程如下圖所示。

那什么是零拷貝呢?顧名思義,零拷貝的意思包括兩個(gè)部分,“零”和“拷貝”:

  • “拷貝”:就是指數(shù)據(jù)從一個(gè)存儲(chǔ)區(qū)域轉(zhuǎn)移到另一個(gè)存儲(chǔ)區(qū)域。
  • “零” :表示次數(shù)為0,它表示拷貝數(shù)據(jù)的次數(shù)為0。

合起來(lái)“零拷貝”就是不需要將數(shù)據(jù)從一個(gè)存儲(chǔ)區(qū)域復(fù)制到另一個(gè)存儲(chǔ)區(qū)域。

2、為什么要零拷貝

零拷貝主要是指將系統(tǒng)內(nèi)核空間的內(nèi)存和用戶空間的內(nèi)存實(shí)現(xiàn)直接關(guān)聯(lián)映射,從而省去了數(shù)據(jù)傳輸過(guò)程中的來(lái)回拷貝,也就是說(shuō),要完成數(shù)據(jù)傳輸數(shù)據(jù)拷貝次數(shù)為0次。

有這么一段代碼,主要將服務(wù)端主機(jī)磁盤中的文件從已連接的socket發(fā)出去。關(guān)鍵實(shí)現(xiàn)代碼如下:

while((n = read(diskfd, buf, BUF_SIZE)) > 0){
write(sockfd, buf , n);
}

以上代碼是用傳統(tǒng)的IO編寫的,它的執(zhí)行過(guò)程大致是這樣的:

首先,read()方法,會(huì)把數(shù)據(jù)從磁盤循環(huán)讀取到內(nèi)核緩沖區(qū),再拷貝到用戶緩沖區(qū)。

然后,write()方法先把數(shù)據(jù)寫入到socket緩沖區(qū),最后寫入網(wǎng)卡設(shè)備。

因?yàn)?,傳統(tǒng)的IO在在數(shù)據(jù)傳輸過(guò)程中拷貝次數(shù)太多,導(dǎo)致性能低下。為了減少拷貝次數(shù),增加系統(tǒng)性能,才有了零拷貝的設(shè)計(jì)。另外,零拷貝并不是指完全沒(méi)有文件的拷貝,只是減少了拷貝的次數(shù)。

3、零拷貝在Netty中的實(shí)現(xiàn)

從流程圖可以看出,傳統(tǒng)IO的讀寫流程,包括了4次用戶態(tài)和內(nèi)核態(tài)的切換,也就是4次上下文切換,4次數(shù)據(jù)拷貝,其中兩次CPU拷貝以及兩次的DMA拷貝。關(guān)于上下文切換和DMA拷貝,在這里我們就不詳細(xì)贅述了,以后可以單獨(dú)拍攝一期視頻來(lái)詳細(xì)介紹。想了解的小伙伴可以在評(píng)論區(qū)回復(fù)666.

那在Netty中,是如何實(shí)現(xiàn)零拷貝的呢?有以下三種方式

(1) 使用堆外內(nèi)存,也叫直接內(nèi)存。Netty的接收和發(fā)送都采用DIRECT BUFFERS,對(duì)應(yīng)系統(tǒng)底層的mmap機(jī)制,直接使用堆外內(nèi)存進(jìn)行Socket讀寫,不需要進(jìn)行字節(jié)緩沖區(qū)的二次拷貝。

(2) 提供了組合Buffer對(duì)象,可以聚合多個(gè)ByteBuffer對(duì)象,用戶只需要像操作一個(gè)Buffer一樣方便的對(duì)組合Buffer進(jìn)行操作,避免了傳統(tǒng)通過(guò)內(nèi)存拷貝的方式將幾個(gè)小Buffer合并成一個(gè)大的Buffer,不需要做內(nèi)存拷貝。

(3) 的文件傳輸采用了transferTo方法,直接使用了NIO的sendfile機(jī)制,它可以直接將文件緩沖區(qū)的數(shù)據(jù)發(fā)送到目標(biāo)Channel,避免了傳統(tǒng)通過(guò)循環(huán)write方式導(dǎo)致的內(nèi)存拷貝問(wèn)題。

責(zé)任編輯:姜華 來(lái)源: Tom彈架構(gòu)
相關(guān)推薦

2023-07-29 13:45:30

了不起 Java極

2024-12-26 17:04:47

2021-03-12 13:57:13

零拷貝技術(shù)

2023-08-26 21:42:08

零拷貝I/O操作

2023-07-27 08:26:36

零拷貝I/O操作

2024-06-07 08:10:14

Netty操作系統(tǒng)零拷貝

2016-11-23 19:09:39

javanetty

2024-11-11 10:15:04

CPULinux系統(tǒng)

2024-01-09 18:09:43

模型方式DMA

2022-02-09 09:37:54

ReactorNettyI/O

2024-10-28 09:38:15

2023-06-05 08:00:00

mTLSIstio安全

2022-09-23 08:47:01

DMA網(wǎng)卡CPU

2023-07-11 10:33:48

凈零度碳排放

2024-12-09 09:00:00

拷貝構(gòu)造函數(shù)傳遞編程

2021-09-17 12:50:10

MySQL數(shù)據(jù)庫(kù)ACID

2024-11-05 15:02:41

2022-10-28 11:44:44

物聯(lián)網(wǎng)IoT

2023-05-17 15:36:57

2020-11-17 14:28:56

數(shù)據(jù)中心
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)