久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

阿里P7二面:聊聊零拷貝的原理

 hlhq1 2019-07-17
  1. 老顧在接觸大數據相關技術棧時,,發(fā)現(xiàn)大數據相關的技術也是非常復雜,技術迭代也是很快的(我們搞技術的就是這么悲催啊,,一直處于學習中.....),。很多更新的技術在宣傳的時候,都會提到速度,、性能這個指標,,什么提升了10倍,100倍啊。其中有一個技術點叫做zero-copy,,也叫做零拷貝,是很多中間件都用到的技術,,今天老顧就來給大家講講什么是零拷貝,。

傳統(tǒng)讀操作

阿里P7二面:聊聊零拷貝的原理

JAVA用傳統(tǒng)方式進行讀操作時整體流程如上圖,,具體如下:

1,、應用程序發(fā)起讀數據操作,JVM會發(fā)起read()系統(tǒng)調用,。

2,、這時操作系統(tǒng)OS會進行一次上下文切換(把用戶空間切換到內核空間)

3、通過磁盤控制器把數據copy到內核緩沖區(qū)中,,這里的就發(fā)生了一次DMA Copy

4,、然后內核將數據copy到用戶空間的應用緩沖區(qū)中,發(fā)生了一次CPU Copy

5,、read調用返回后,,會再進行一次上下文切換(把內核空間切換到用戶空間)

我們看一下一個讀操作,發(fā)了2次上下文切換,,和2次數據copy,,一次是DMA Copy,一次是CPU Copy,。

注意一點的是 內核從磁盤上面讀取數據 是 不消耗CPU時間的,,是通過磁盤控制器完成;稱之為DMA Copy,。

傳統(tǒng)寫操作

阿里P7二面:聊聊零拷貝的原理

上圖是JAVA傳統(tǒng)的寫操作,,具體流程:

1、應用發(fā)起寫操作,,OS進行一次上下文切換(從用戶空間切換為內核空間)

2,、并且把數據copy到內核緩沖區(qū)Socket Buffer,做了一次CPU Copy

3,、內核空間再把數據copy到磁盤或其他存儲(網卡,,進行網絡傳輸),進行了DMA Copy

4,、寫入結束后返回,,又從內核空間切換到用戶空間

傳統(tǒng)IO

我們可以看出傳統(tǒng)的IO讀寫操作,總共進行了4次上下文切換,,4次Copy動作,。我們可以看到數據在內核空間和應用空間之間來回復制,其實他們什么都沒有做,就是復制而已,,這個機制太浪費時間了,,而且是浪費的CPU的時間

那我們能不能讓數據不要來回復制呢,?零拷貝這個技術就是來解決這個問題,。關于零拷貝提供了兩種解決方式:mmap+write方式、sendfile方式

虛擬內存

所有現(xiàn)代操作系統(tǒng)都使用虛擬內存,,使用虛擬地址取代物理地址,,這樣做的好處就是:

1、多個虛擬內存可以指向同一個物理地址

2,、虛擬內存空間可以遠遠大于物理內存空間

我們利用第一條特性可以優(yōu)化一下上面的設計思路,,就是把內核空間和用戶空間的虛擬地址映射到同一個物理地址,這樣就不需要來回復制了,,看圖:

阿里P7二面:聊聊零拷貝的原理

mmap+write方式

使用mmap+write方式替換原來的傳統(tǒng)IO方式,,就是利用了虛擬內存的特性,看圖

阿里P7二面:聊聊零拷貝的原理

整體流程的核心區(qū)別就是,,把數據讀取到內核緩沖區(qū)后,,應用程序進行寫入操作時,直接是把內核的Read Buffer的數據 復制到 Socket Buffer 以便進行寫入,,這次內核之間的復制也是需要CPU參與的,。

注意:最后把Socket Buffer數據拷貝到很多地方,統(tǒng)稱protocol engine(協(xié)議引擎)

這個流程就少了一個CPU Copy,,提升了IO的速度,。不過發(fā)現(xiàn)上下文的切換還是4次,沒有減少,,因為還是要應用程序發(fā)起write操作,。那能不能減少上下文切換呢?

sendfile方式

這種方式可以替換上面的mmap+write方式,,如:

mmap();write();

替換為

sendfile();

這樣就減少了一次上下文切換,,因為少了一個應用程序發(fā)起write操作,直接發(fā)起sendfile操作,。

到這里就只有3次Copy,,其中只有1次CPU Copy;3次上下文切換,。那能不能把CPU Copy減少到沒有呢,?

gather

Linux2.4內核進行了優(yōu)化,提供了gather操作,,這個操作可以把最后一次CPU Copy去除,,什么原理呢,?就是在內核空間Read Buffer和Socket Buffer不做數據復制,而是將Read Buffer的內存地址,、偏移量記錄到相應的Socket Buffer中,,這樣就不需要復制(其實本質就是和虛擬內存的解決方法思路一樣,就是內存地址的記錄),,如圖:

阿里P7二面:聊聊零拷貝的原理

JAVA零拷貝

java nio實現(xiàn)零拷貝,,JAVA提供了一下方法類:

1、MappedByteBuffer2,、DirectByteBuffer3、FileChannel.transferTo

具體如何使用,,小伙伴們上網自行查閱,。

總結

零拷貝技術在很多中間件中,都有利用,;如:Kafka,,Spark、RocketMQ等,,這個在網絡傳輸數據時,,能夠提升速度,提升系統(tǒng)性能,、吞吐量,。小伙伴們不一定會編寫,可以先了解基本原理就行,。很多好的中間件產品都需要了解一些計算機原理方面的知識,,才會更深入的理解。

    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多