免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
高性能IO背后原理-零拷貝(zero copy)技術(shù)概述

預(yù)備知識(shí)

關(guān)于I/O內(nèi)存映射。

設(shè)備通過(guò)控制總線,數(shù)據(jù)總線,狀態(tài)總線與CPU相連??刂瓶倲?shù)傳送控制信號(hào)。在傳統(tǒng)的操作中,都是通過(guò)讀寫(xiě)設(shè)備寄存器的值來(lái)實(shí)現(xiàn)。但是這樣耗費(fèi)了CPU時(shí)鐘。而且每取一次值都要讀取設(shè)備寄存器,造成了效率的低下。在現(xiàn)代操作系統(tǒng)中。引用了I/O內(nèi)存映射。即把寄存器的值映身到主存。對(duì)設(shè)備寄存器的操作,轉(zhuǎn)換為對(duì)主存的操作,這樣極大的提高了效率。

關(guān)于DMA

傳統(tǒng)的處理方法為:當(dāng)設(shè)備接收到數(shù)據(jù),向CPU報(bào)告中斷。CPU處理中斷,CPU把數(shù)據(jù)從設(shè)備的寄存器數(shù)據(jù)讀到內(nèi)存。

在現(xiàn)代操作系統(tǒng)中引入的DMA設(shè)備,設(shè)備接收到數(shù)據(jù)時(shí),把數(shù)據(jù)放至DMA內(nèi)存,再向CPU產(chǎn)生中斷。這樣節(jié)省了大量的CPU時(shí)間

什么是零拷貝?

零拷貝描述的是CPU不執(zhí)行拷貝數(shù)據(jù)從一個(gè)存儲(chǔ)區(qū)域到另一個(gè)存儲(chǔ)區(qū)域的任務(wù),這通常用于通過(guò)網(wǎng)絡(luò)傳輸一個(gè)文件時(shí)以減少CPU周期和內(nèi)存帶寬。

避免數(shù)據(jù)拷貝

  • 避免操作系統(tǒng)內(nèi)核緩沖區(qū)之間進(jìn)行數(shù)據(jù)拷貝操作。
  • 避免操作系統(tǒng)內(nèi)核和用戶應(yīng)用程序地址空間這兩者之間進(jìn)行數(shù)據(jù)拷貝操作。
  • 用戶應(yīng)用程序可以避開(kāi)操作系統(tǒng)直接訪問(wèn)硬件存儲(chǔ)。

零拷貝給我們帶來(lái)的好處

  • 減少甚至完全避免不必要的CPU拷貝,從而讓CPU解脫出來(lái)去執(zhí)行其他的任務(wù)
  • 減少內(nèi)存帶寬的占用
  • 通常零拷貝技術(shù)還能夠減少用戶空間和操作系統(tǒng)內(nèi)核空間之間的上下文切換

零拷貝完全依賴于操作系統(tǒng)。操作系統(tǒng)支持

通過(guò)sendfile實(shí)現(xiàn)的零拷貝I/O

sendfile(socket, file, len);//file可以是文件句柄,也可以是socket句柄

把文件數(shù)據(jù)通過(guò)網(wǎng)絡(luò)發(fā)送出去,減少了上下文的切換,內(nèi)核的緩存數(shù)據(jù)到直接網(wǎng)卡數(shù)據(jù)也不用CPU去復(fù)制,由DMA完成

  • 第1步發(fā)出sendfile系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(第一次上下文切換)。
  • 第2步通過(guò)DMA將磁盤(pán)文件中的內(nèi)容拷貝到內(nèi)核空間緩沖區(qū)中(第一次拷貝: hard driver ——> kernel buffer)。
  • 第3步數(shù)DMA發(fā)出中斷,CPU處理中斷,將數(shù)據(jù)從內(nèi)核空間緩沖區(qū)拷貝到內(nèi)核中與socket相關(guān)的緩沖區(qū)(第二次拷貝: kernel buffer ——> socket buffer)。
  • sendfile系統(tǒng)調(diào)用返回,導(dǎo)致內(nèi)核空間到用戶空間的上下文切換(第二次上下文切換)。
  • 第4步通過(guò)DMA引擎將內(nèi)核空間socket緩沖區(qū)中的數(shù)據(jù)傳遞到網(wǎng)卡(第三次拷貝: socket buffer ——> 網(wǎng)卡)。

通過(guò)sendfile實(shí)現(xiàn)的零拷貝I/O只使用了2次用戶空間與內(nèi)核空間的上下文切換,以及3次數(shù)據(jù)的拷貝。實(shí)現(xiàn)了把數(shù)據(jù)從文件發(fā)送到網(wǎng)卡。

傳統(tǒng)的IO流程實(shí)現(xiàn)文件數(shù)據(jù)發(fā)送

read(file, tmp_buf, len);write(socket, tmp_buf, len);
  • 第1步調(diào)用read(),上下文切換到內(nèi)核,DMA把磁盤(pán)數(shù)據(jù)復(fù)制到內(nèi)核的緩存空間
  • 第2步read()返回,上下文切換到用戶進(jìn)程,CPU把數(shù)據(jù)復(fù)制到用戶的緩存空間
  • 第3步write() 上下文切換到內(nèi)核,CPU把數(shù)據(jù)復(fù)制到內(nèi)核socket緩存,write返回,上下文切換的進(jìn)程

第4步DMP把socket緩存數(shù)據(jù)復(fù)制到網(wǎng)卡緩存上

經(jīng)過(guò)4次上下文切換,4次數(shù)據(jù)拷貝,在數(shù)據(jù)量比較大時(shí),性能比sendfile方式低下

通過(guò)mmap實(shí)現(xiàn)的零拷貝I/O

mmap(內(nèi)存映射)是一個(gè)比sendfile昂貴但優(yōu)于傳統(tǒng)I/O的方法。

MappedByteBuffer

在調(diào)用FileChannel.map()時(shí)使用。 與DirectByteBuffer類似,這也是JVM堆外部的情況。 它基本上作為OS mmap()系統(tǒng)調(diào)用的包裝函數(shù),以便代碼直接操作映射的物理內(nèi)存數(shù)據(jù)。

HeapByteBuffer

在調(diào)用ByteBuffer.allocate()時(shí)使用。 它被稱為堆,因?yàn)樗4嬖贘VM的堆空間中,因此你可以獲得所有優(yōu)勢(shì),如GC支持和緩存優(yōu)化。 但是,它不是頁(yè)面對(duì)齊的,這意味著如果你需要通過(guò)JNI與本地代碼交互時(shí),比如寫(xiě)入網(wǎng)卡,寫(xiě)入磁盤(pán),JVM將不得不復(fù)制到系統(tǒng)的頁(yè)緩沖區(qū)空間。

DirectByteBuffer

在調(diào)用ByteBuffer.allocateDirect()時(shí)使用。 JVM在堆空間之外分配內(nèi)存空間。 因?yàn)樗皇怯蒍VM管理的,所以你的內(nèi)存空間是頁(yè)面對(duì)齊的,不受GC影響,這使得它成為處理本地代碼的完美選擇。 然而,你要C程序員一樣,自己管理這個(gè)內(nèi)存,必須自己分配和釋放內(nèi)存來(lái)防止內(nèi)存泄漏。

splice

在兩個(gè)文件描述符之間傳輸數(shù)據(jù),不用拷貝。但輸入和輸出文件描述符必須有一個(gè)是pipe。也就是說(shuō)如果你需要從一個(gè)socket 傳輸數(shù)據(jù)到另外一個(gè)socket,是需要使用 pipe來(lái)做為中介的

splice (socket1_fd, pipe_fd) splice (pipl_fd, socket2_fd)

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
阿里P7二面:聊聊零拷貝的原理
阿里二面:什么是mmap?
sendfile 零拷貝
為什么 Kafka 的吞吐量那么高?
圖解|零拷貝Zero-Copy技術(shù)大揭秘
操作系統(tǒng)IO之零拷貝技術(shù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服