AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

對IO概念模糊:計(jì)算機(jī)IO過程與零拷貝

來源: 責(zé)編: 時(shí)間:2023-10-08 07:04:51 282觀看
導(dǎo)讀一、前置知識1.1 內(nèi)存分段現(xiàn)代計(jì)算機(jī)在加載操作系統(tǒng)、正常啟動后,其內(nèi)存會主要分成兩大段:內(nèi)核段用戶段內(nèi)核段:操作系統(tǒng)本質(zhì)上是一個(gè)計(jì)算機(jī)的管理程序,該程序相關(guān)的所有資源,被存放在內(nèi)核段中。用戶段:用戶段用來存放各個(gè)進(jìn)

一、前置知識

1.1 內(nèi)存分段

現(xiàn)代計(jì)算機(jī)在加載操作系統(tǒng)、正常啟動后,其內(nèi)存會主要分成兩大段:UGv28資訊網(wǎng)——每日最新資訊28at.com

  • 內(nèi)核段
  • 用戶段

內(nèi)核段:UGv28資訊網(wǎng)——每日最新資訊28at.com

操作系統(tǒng)本質(zhì)上是一個(gè)計(jì)算機(jī)的管理程序,該程序相關(guān)的所有資源,被存放在內(nèi)核段中。UGv28資訊網(wǎng)——每日最新資訊28at.com

用戶段:UGv28資訊網(wǎng)——每日最新資訊28at.com

用戶段用來存放各個(gè)進(jìn)程的數(shù)據(jù)和指令。UGv28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)所訪問的內(nèi)存段的不同,CPU會處于不同的態(tài),訪問用戶段的時(shí)候處于用戶態(tài),訪問內(nèi)核段的時(shí)候處于內(nèi)核態(tài)。UGv28資訊網(wǎng)——每日最新資訊28at.com

1.2 CPU的態(tài)

1.2.1 CPU的工作過程

CPU要執(zhí)行的指令的地址存在寄存器中,指令存放在內(nèi)存中,而CPU本質(zhì)上就是一個(gè)去內(nèi)存中根據(jù)地址取指令,然后執(zhí)行指令的硬件。UGv28資訊網(wǎng)——每日最新資訊28at.com

舉一個(gè)例子:UGv28資訊網(wǎng)——每日最新資訊28at.com

例如PC寄存器中存放50,CPU讀到存放的50,發(fā)出一條取址指令,去取出地址為50的內(nèi)存單元中的指令,再傳回給CPU。UGv28資訊網(wǎng)——每日最新資訊28at.com

UGv28資訊網(wǎng)——每日最新資訊28at.com

UGv28資訊網(wǎng)——每日最新資訊28at.com

1.4 IO與內(nèi)存

計(jì)算機(jī)進(jìn)行IO的時(shí)候,本質(zhì)上會為每一個(gè)IO設(shè)備在內(nèi)存中分配一塊空間,向這塊空間里進(jìn)行讀寫,即可完成IO。為什么給IO設(shè)備分配的內(nèi)存會是在內(nèi)核段里喃?主要是基于兩點(diǎn)進(jìn)行考慮的:UGv28資訊網(wǎng)——每日最新資訊28at.com

  • 安全性
  • 特權(quán)操作

1.4.1 安全性:

I/O 操作通常需要與計(jì)算機(jī)的外部設(shè)備(如磁盤、網(wǎng)絡(luò)設(shè)備等)進(jìn)行交互,如果允許各個(gè)進(jìn)程自己私自與外部設(shè)備進(jìn)行交互,IO的內(nèi)存放在各個(gè)進(jìn)程內(nèi)部,太散了,不是很好進(jìn)行安全控制,相反,如果將IO的內(nèi)存放在內(nèi)核段,就很便于集中管理,可以附加一些安全機(jī)制上去。UGv28資訊網(wǎng)——每日最新資訊28at.com

1.4.2 特權(quán)操作:

首先IO指令本身就是特權(quán)指令,會讓CPU進(jìn)入內(nèi)核態(tài),其次進(jìn)行IO的時(shí)候會用到中斷信號,也涉及到特權(quán)指令,也要求CPU處于內(nèi)核態(tài),所以如果IO內(nèi)存是在內(nèi)核段中,讓CPU提前進(jìn)入內(nèi)核狀態(tài),也避免了后面來回切狀態(tài)造成的時(shí)間浪費(fèi)。UGv28資訊網(wǎng)——每日最新資訊28at.com

整個(gè)IO在內(nèi)存中的流轉(zhuǎn)過程如下:UGv28資訊網(wǎng)——每日最新資訊28at.com

讀的時(shí)候磁盤拷貝到內(nèi)核段、內(nèi)核段拷貝到用戶段,UGv28資訊網(wǎng)——每日最新資訊28at.com

寫的時(shí)候用戶段拷貝到內(nèi)核段、內(nèi)核段拷貝到磁盤。UGv28資訊網(wǎng)——每日最新資訊28at.com

一共四次復(fù)制。UGv28資訊網(wǎng)——每日最新資訊28at.com

UGv28資訊網(wǎng)——每日最新資訊28at.com

特別說明:UGv28資訊網(wǎng)——每日最新資訊28at.com

我知道其它很多地方這里將圖畫成了這個(gè)樣子:UGv28資訊網(wǎng)——每日最新資訊28at.com

UGv28資訊網(wǎng)——每日最新資訊28at.com

之所以能實(shí)現(xiàn)這樣的效果是得益于操作系統(tǒng)底層有兩種讀操作:UGv28資訊網(wǎng)——每日最新資訊28at.com

讀取數(shù)據(jù):常見的系統(tǒng)調(diào)用如 read()(用于文件描述符)或 recv()(用于套接字)用于從文件或套接字中讀取數(shù)據(jù)。這些系統(tǒng)調(diào)用從相應(yīng)的輸入源(如磁盤、網(wǎng)絡(luò)等)讀取數(shù)據(jù),并將其復(fù)制到應(yīng)用程序提供的緩沖區(qū)中。這種方式涉及了數(shù)據(jù)的復(fù)制,因?yàn)閿?shù)據(jù)需要從內(nèi)核態(tài)復(fù)制到用戶態(tài)緩沖區(qū)中。UGv28資訊網(wǎng)——每日最新資訊28at.com

讀取映射:另一種方式是通過內(nèi)存映射(Memory Mapping)來實(shí)現(xiàn)讀取操作。通過將文件或設(shè)備的數(shù)據(jù)映射到進(jìn)程的內(nèi)存區(qū)域中,應(yīng)用程序可以直接訪問內(nèi)存映射區(qū)域中的數(shù)據(jù),而無需使用傳統(tǒng)的 read() 系統(tǒng)調(diào)用。在這種情況下,應(yīng)用程序可以通過直接讀取內(nèi)存映射區(qū)域中的數(shù)據(jù)來獲取文件或設(shè)備的內(nèi)容,避免了中間的數(shù)據(jù)復(fù)制。UGv28資訊網(wǎng)——每日最新資訊28at.com

特別說明:UGv28資訊網(wǎng)——每日最新資訊28at.com

還是和上文類似,畫圖的問題。這里為了涵蓋,本地IO和網(wǎng)絡(luò)IO兩種情況,內(nèi)核段沒拆成幾個(gè)設(shè)備的不同地址空間,但是如果是從磁盤中讀,然后向網(wǎng)絡(luò)中寫,是跨了IO設(shè)備的,所以中間有個(gè)內(nèi)核段地址間的復(fù)制過程,如下圖:UGv28資訊網(wǎng)——每日最新資訊28at.com

UGv28資訊網(wǎng)——每日最新資訊28at.com

三、JAVA中的零拷貝

零拷貝需要進(jìn)行系統(tǒng)調(diào)用才能實(shí)現(xiàn),很明顯要我們手寫實(shí)現(xiàn)零拷貝是很底層、很麻煩的,好在JAVA在NIO中封裝了mmap、SendFile兩種零拷貝的API,當(dāng)我們想在JAVA中使用零拷貝時(shí),直接調(diào)API即可。UGv28資訊網(wǎng)——每日最新資訊28at.com

很多同學(xué)在NIO中老是搞不明白channel和buffer的關(guān),容易暈,這里博主一句話總結(jié)一下:UGv28資訊網(wǎng)——每日最新資訊28at.com

JavaNlO中 的Channel就相當(dāng)于操作系統(tǒng)中的內(nèi)核緩沖區(qū),而Buffer就相當(dāng)于操作系統(tǒng)中的用戶緩沖區(qū)。UGv28資訊網(wǎng)——每日最新資訊28at.com

mmap:UGv28資訊網(wǎng)——每日最新資訊28at.com

MappedByteBuffer mappedByteBuffer = new RandomAccessFile(file, "r")                                  .getChannel()                                 .map(FileChannel.MapMode.READ_ONLY, 0, len);

SendFile:UGv28資訊網(wǎng)——每日最新資訊28at.com

sendFile進(jìn)行網(wǎng)絡(luò)傳輸:UGv28資訊網(wǎng)——每日最新資訊28at.com

FileChannel sourceChannel = new RandomAccessFile(sourceFile, "rw").getChannel();SocketChannel socketChannel = SocketChannel.open(sa);sourceChannel.transferTo(0, sourceChannel.size(), socketChannel);

sendFile進(jìn)行文件拷貝:UGv28資訊網(wǎng)——每日最新資訊28at.com

try (FileChannel srcChannel = new FileInputStream(src).getChannel();     FileChannel targetChannel = new FileInputStream(target).getChannel()) {     srcChannel.transferTo(0, srcChannel.size(), targetChannel ); } catch (IOException e) {     e.printStackTrace(); }


UGv28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-12196-0.html對IO概念模糊:計(jì)算機(jī)IO過程與零拷貝

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 深入了解快速排序:原理、性能分析與 Java 實(shí)現(xiàn)

下一篇: 三個(gè)殺手級VS Code插件

標(biāo)簽:
  • 熱門焦點(diǎn)
Top