色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

傳統(tǒng)IO演化至零拷貝的過程

科技綠洲 ? 來源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-09 09:09 ? 次閱讀

零拷貝(Zero-Copy)用于在數(shù)據(jù)讀寫過程中減少不需要的CPU拷貝,CPU就那么幾個(gè),減少它的負(fù)擔(dān)自然可以提高處理效率。數(shù)據(jù)傳輸有本地的文件拷貝和通過socket進(jìn)行文件傳輸兩種,兩者區(qū)別不大,只是文件數(shù)據(jù)最終的去向仍然是本地磁盤還是網(wǎng)卡的區(qū)別,這里以socket文件為例介紹傳統(tǒng)IO演化至零拷貝的過程。

介紹零拷貝之前,可以先看一下傳統(tǒng)IO,借此熟悉一些相關(guān)概念,先上圖:

圖片

首先要知道操作系統(tǒng)已經(jīng)隔離了兩塊運(yùn)行空間,即用戶空間和內(nèi)核空間。可以理解為用戶程序是跑在用戶空間的,而操作系統(tǒng)的內(nèi)核代碼是跑在內(nèi)核空間的,把這兩個(gè)隔離是為了用戶程序的故障不影響操作系統(tǒng)。其實(shí)現(xiàn)代操作系統(tǒng)已經(jīng)對(duì)數(shù)據(jù)的拷貝做了優(yōu)化,之前把數(shù)據(jù)從底層硬件拷貝到內(nèi)核空間也是CPU來的,現(xiàn)在CPU只需要通知一下DMA(Direct Memory Access,直接內(nèi)存存取),拷貝工作就交給DMA了,這樣CPU就解放出來做其他事去了,所以現(xiàn)代操作系統(tǒng)底層硬件和內(nèi)核空間之間的數(shù)據(jù)拷貝CPU參與的很少可以不予考慮,都是DMA來的,但是內(nèi)核空間和用戶空間之間的活都是CPU親自上的。

從上圖可以看出,傳統(tǒng)IO是這么幾個(gè)步驟:

1.線程在用戶空間發(fā)起read()讀文件,線程從用戶態(tài)切換為內(nèi)核態(tài)

2.DMA將磁盤數(shù)據(jù)拷貝到內(nèi)核緩存后,CPU又將數(shù)據(jù)從內(nèi)核緩存拷貝至用戶緩存,這時(shí)線程又從內(nèi)核態(tài)切換為用戶態(tài)

3.這時(shí)候知道了數(shù)據(jù)應(yīng)該往哪里寫,CPU將數(shù)據(jù)從用戶緩存拷貝至socket緩存,線程又從用戶態(tài)切換到內(nèi)核態(tài)

4.最后DMA將數(shù)據(jù)從內(nèi)核緩存拷貝到網(wǎng)卡,read()調(diào)用結(jié)束返回,線程又從內(nèi)核態(tài)切換到用戶態(tài)

整個(gè)過程線程上下文切換了四次,一共有四次拷貝,2次CPU來的,2次DMA來的。觀察圖不經(jīng)會(huì)想,為啥數(shù)據(jù)要在用戶空間走一趟呢,能不能在內(nèi)核空間直接從內(nèi)核緩存到socket緩存呢,答案是可以的,這就是第一種零拷貝技術(shù)的原理,即mmap+write,先上圖:

圖片

mmap即內(nèi)存映射,mmap()是由unix/linux操作系統(tǒng)來調(diào)用的,它可以將內(nèi)核緩存中的一塊區(qū)域與用戶緩存中的一塊區(qū)域形成映射關(guān)系,即共享內(nèi)存,不過在用戶緩存中的這塊映射區(qū)域是堆外內(nèi)存。建立映射關(guān)系后,理解起來就是往其中任意一頭寫另外一頭也寫進(jìn)去了,這樣是為了省掉一次CPU拷貝,傳統(tǒng)IO要把數(shù)據(jù)從內(nèi)核緩存拷貝到用戶緩存才能寫,現(xiàn)在直接在用戶緩存寫,有了映射關(guān)系,對(duì)應(yīng)的那塊內(nèi)核緩存也有了。mmap+write實(shí)現(xiàn)的零拷貝流程是這樣的:

1.用戶進(jìn)程要讀一個(gè)磁盤文件,告訴內(nèi)核進(jìn)程發(fā)起mmap()函數(shù)調(diào)用,來來來把你的內(nèi)核緩存和我的一塊用戶緩存建立下映射關(guān)系,我要讀這個(gè)磁盤文件了。

2.內(nèi)核進(jìn)程乖乖調(diào)用了mmap()函數(shù),將一塊內(nèi)核緩存和用戶緩存中的一塊堆外內(nèi)存建立的映射關(guān)系。并且告訴DMA將這個(gè)文件中的數(shù)據(jù)拷貝到了這塊內(nèi)核緩存中。到這里mmap()函數(shù)就調(diào)用結(jié)束了,任務(wù)完成。嚴(yán)格的說到這里為止都不算IO過程,因此也沒有統(tǒng)計(jì)線程的上下文切換次數(shù)。

3.這才開始IO,因?yàn)榇疟P文件已經(jīng)被DMA拷貝到內(nèi)核緩存中去了,又被映射到了這塊堆外內(nèi)存,所以就直接在用戶緩存里就讀到了,線程沒有上下文切換,然后準(zhǔn)備寫進(jìn)一塊socket緩存里去了,線程發(fā)起了write()調(diào)用,狀態(tài)由用戶態(tài)切換為內(nèi)核態(tài),這時(shí)候內(nèi)核基于CPU拷貝將數(shù)據(jù)從那塊映射著的內(nèi)核緩存拷貝到socket緩存,CPU也就拷貝了這一次。

4.然后又是DMA將數(shù)據(jù)從socket緩存拷貝到網(wǎng)卡,最后write()函數(shù)調(diào)用返回,線程從內(nèi)核態(tài)切換到用戶態(tài)。

整個(gè)過程線程切換了兩次,一共有三次拷貝,其中2次DMA拷貝,1次CPU拷貝。到這里CPU已經(jīng)輕松不少了,就拷貝了一次嘛,可以不是說好的零拷貝的嘛,怎么還有一次拷貝,然后sendfile()函數(shù)就登場(chǎng)了,它是實(shí)實(shí)在在的實(shí)現(xiàn)了零拷貝,先上圖:

圖片

sendfile()也是操作系統(tǒng)來調(diào)用的,用戶線程只能通過特定的方法發(fā)起調(diào)用,比如java.nio包下的FileChannel,它的transferTo()方法可以發(fā)起sendfile()函數(shù)的調(diào)用。sendfile()函數(shù)實(shí)現(xiàn)零拷貝的過程是這樣的:

1.用戶線程發(fā)起sendfile()函數(shù)調(diào)用,與mmap()函數(shù)不同的是,不單單告訴內(nèi)核去哪里讀數(shù)據(jù),往哪里寫數(shù)據(jù)也一起告訴內(nèi)核了。這時(shí)候就已經(jīng)開始算IO了,線程從用戶態(tài)切換到了內(nèi)核態(tài)。

2.知道了從哪里讀數(shù)據(jù),依然是DMA去磁盤里把數(shù)據(jù)拷貝到內(nèi)核緩存中去,由于同時(shí)也知道了應(yīng)該往哪里寫數(shù)據(jù),那就接著干活唄。

3.先把數(shù)據(jù)描述信息從內(nèi)核緩存復(fù)制到指定的socket緩存,然后DMA又來了,這個(gè)時(shí)候socket緩存中的數(shù)據(jù)描述信息就起作用了,這些描述信息主要是數(shù)據(jù)的位置信息等。DMA Gather通過這些數(shù)據(jù)描述信息將數(shù)據(jù)從內(nèi)核緩存拷貝到網(wǎng)卡。

4.sendfile()函數(shù)調(diào)用結(jié)束,線程從內(nèi)核態(tài)切換到了用戶態(tài),CPU一次拷貝都沒有!零!

這就是真正的零拷貝,整個(gè)過程用戶線程切換了兩次,只有兩次拷貝,但都是DMA來的。

關(guān)于第三種零拷貝方式,這是Linux2.4對(duì)sendfile做了改進(jìn)之后的零拷貝。其實(shí)linux 2.1 內(nèi)核開始就引入了sendfile()函數(shù),當(dāng)時(shí)的零拷貝是這樣的。

圖片

可以看出整個(gè)過程用戶線程切換了兩次,有三次拷貝,兩次DMA來的,還是有一次CPU拷貝。這種零拷貝方式和mmap+write方式有點(diǎn)類似,但是這也算零拷貝演進(jìn)過程中的一環(huán)。

sendfile()函數(shù)的man page里面有這句話: In Linux kernels before 2.6.33, out_fd must refer to a socket. Since Linux 2.6.33 it can be any file. 也就是說Linux2.6.33之前sendfile()只能用于文件到socket的傳輸。而Linux2.6.33之后可以用于兩個(gè)文件描述符之間和文件到socket之間的傳輸。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • IO
    IO
    +關(guān)注

    關(guān)注

    0

    文章

    448

    瀏覽量

    39134
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10855

    瀏覽量

    211595
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7006

    瀏覽量

    88944
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深度解析Linux中拷貝原理

    所謂「拷貝」描述的是計(jì)算機(jī)操作系統(tǒng)當(dāng)中,CPU不執(zhí)行將數(shù)據(jù)從一個(gè)內(nèi)存區(qū)域,拷貝到另外一個(gè)內(nèi)存區(qū)域的任務(wù)。通過網(wǎng)絡(luò)傳輸文件時(shí),這樣通常可以節(jié)省 CPU 周期和內(nèi)存帶寬。
    發(fā)表于 03-01 14:39 ?2629次閱讀

    利用PLD實(shí)現(xiàn)智能演化計(jì)算

    演化計(jì)算是一種通過模擬的自然界的生物演化過程搜索最優(yōu)解的方法,主要包括遺傳算法(CA)、演化策略(ES)、演化規(guī)劃(EP)等。演化計(jì)算具有子
    發(fā)表于 06-26 17:43 ?24次下載

    RAID中拷貝技術(shù)研究

    從實(shí)際測(cè)試和理論分析角度出發(fā),研究了采用拷貝技術(shù)對(duì)提高RAID性能的重要性.研究結(jié)果表明拷貝技術(shù)對(duì)RAID性能有很大影響,尤其是在嵌入式環(huán)境下,必須采用
    發(fā)表于 07-01 17:09 ?20次下載

    基礎(chǔ)學(xué)習(xí)LEBVIEW】06 IO接口

    基礎(chǔ)學(xué)習(xí)LEBVIEW】06 IO接口,感興趣的朋友一定要學(xué)習(xí)。
    發(fā)表于 12-31 10:28 ?0次下載

    用于時(shí)鐘的動(dòng)態(tài)演化模型及算法

    傳統(tǒng)分布仿真系統(tǒng)時(shí)鐘不一致影響因素分析方法,已不能滿足當(dāng)前面向服務(wù)分布仿真的時(shí)鐘狀態(tài)分析需要。從系統(tǒng)全局時(shí)鐘演化出發(fā),闡述了時(shí)鐘狀態(tài)演化內(nèi)涵與過程;在此基礎(chǔ)上,基于有限自動(dòng)機(jī)理論,提出
    發(fā)表于 11-22 10:34 ?9次下載
    用于時(shí)鐘的動(dòng)態(tài)<b class='flag-5'>演化</b>模型及算法

    基于微博文本的詞對(duì)主題演化模型

    針對(duì)傳統(tǒng)主題模型忽略了微博短文本和文本動(dòng)態(tài)演化的問題,提出了基于微博文本的詞對(duì)主題演化( BToT)模型,并根據(jù)所提模型對(duì)數(shù)據(jù)集進(jìn)行主題演化分析。BToT模型在文本生成
    發(fā)表于 12-03 11:31 ?14次下載
    基于微博文本的詞對(duì)主題<b class='flag-5'>演化</b>模型

    相場(chǎng)模擬—盡“顯”增材制造過程中的晶粒演化

    (powder-bed-fusion, PBF)技術(shù)是最常用的AM技術(shù)之一。理解并預(yù)測(cè)PBF過程中晶粒演化對(duì)通過調(diào)整工藝以定制樣件的晶粒結(jié)構(gòu)具有重要的指導(dǎo)意義。 目前,通過數(shù)值模擬方法(如元胞自動(dòng)機(jī)法、相場(chǎng)法)可以很好地模擬PBF過程
    的頭像 發(fā)表于 06-15 15:06 ?1977次閱讀

    深入理解Linux系統(tǒng)拷貝技術(shù)

    內(nèi)存拷貝是比較耗時(shí)操作,拷貝是常用優(yōu)化手段,今天分享的文章就是Linux系統(tǒng)拷貝技術(shù),Kafka和MySQL開源組件都用到這個(gè)核心技術(shù),
    的頭像 發(fā)表于 09-01 15:12 ?3051次閱讀

    詳解Linux系統(tǒng)中的拷貝技術(shù)

    Linux系統(tǒng)中一切皆文件,仔細(xì)想一下Linux系統(tǒng)的很多活動(dòng)無外乎讀操作和寫操作,拷貝就是為了提高讀寫性能而出現(xiàn)的。
    的頭像 發(fā)表于 05-18 09:18 ?2363次閱讀
    詳解Linux系統(tǒng)中的<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>技術(shù)

    C++深拷貝和淺拷貝詳解

    當(dāng)類的函數(shù)成員存在指針成員時(shí)會(huì)產(chǎn)生深拷貝和淺拷貝和問題。
    發(fā)表于 08-21 15:05 ?331次閱讀
    C++深<b class='flag-5'>拷貝</b>和淺<b class='flag-5'>拷貝</b>詳解

    信號(hào)驅(qū)動(dòng)IO與異步IO的區(qū)別

    , 是開始處理IO, 這個(gè)時(shí)候還是存在阻塞的,將數(shù)據(jù)從內(nèi)核態(tài)拷貝進(jìn)入到用戶態(tài)的過程至少是阻塞住的 (應(yīng)用程序?qū)?shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)的過程
    的頭像 發(fā)表于 11-08 15:32 ?1056次閱讀
    信號(hào)驅(qū)動(dòng)<b class='flag-5'>IO</b>與異步<b class='flag-5'>IO</b>的區(qū)別

    什么是拷貝技術(shù)

    傳統(tǒng)操作系統(tǒng)的數(shù)據(jù)傳輸過程中,系統(tǒng)內(nèi)部會(huì)在磁盤、內(nèi)存、緩存中多次進(jìn)行數(shù)據(jù)拷貝,每次都會(huì)占用CPU的資源,數(shù)據(jù)量小的時(shí)候還好。 隨著數(shù)據(jù)量的增加,CPU的開銷也會(huì)持續(xù)增加,尤其是在機(jī)器人圖像數(shù)據(jù)
    的頭像 發(fā)表于 11-27 16:20 ?451次閱讀
    什么是<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>技術(shù)

    如何進(jìn)行拷貝性能測(cè)試

    TogetherROS?·Bot拷貝性能測(cè)試 我們使用TogetherROS?·Bot系統(tǒng)內(nèi)部集成的性能測(cè)試工具——performance_test,來評(píng)估下開啟拷貝前后的性能差異
    的頭像 發(fā)表于 11-27 16:51 ?433次閱讀
    如何進(jìn)行<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>性能測(cè)試

    磁盤拷貝機(jī)會(huì)拷貝刪除的內(nèi)容嗎

    升級(jí)等方面非常有用。 然而,關(guān)于磁盤拷貝機(jī)是否會(huì)拷貝已刪除的內(nèi)容,這取決于拷貝過程中使用的具體方法和工具。以下是對(duì)這個(gè)問題的分析: 磁盤空間的分配與管理 在深入了解磁盤
    的頭像 發(fā)表于 10-14 15:38 ?425次閱讀

    批量音頻檔案拷貝最佳方案:解決播放錯(cuò)誤與拷貝不完全問題

    本文討論了在數(shù)字化時(shí)代,專業(yè)SD拷貝機(jī)在批量拷貝音頻檔案MicroSD卡中的應(yīng)用優(yōu)勢(shì)。相較于傳統(tǒng)計(jì)算機(jī)拷貝,SD
    的頭像 發(fā)表于 11-23 16:12 ?145次閱讀
    批量音頻檔案<b class='flag-5'>拷貝</b>最佳方案:解決播放錯(cuò)誤與<b class='flag-5'>拷貝</b>不完全問題
    主站蜘蛛池模板: 大香伊人久久精品一区二区| 色婷婷狠狠97成为人免费| 最新无码国产在线视频9299| 久久久久久久久人体| 伊人亚洲综合青草青草久热| 久久99国产精品自在自在| 伊人久久精品线影院| 99久视频只有精品2019| 免费可以看污动画软件| 99国产精品人妻无码免费| 暖暖的视频完整视频免费韩国| 99国产强伦姧在线看RAPE| 欧美日韩中文字幕综合图区| youjizz护士| 色吧最新网址| 国产精品无码AV天天爽色欲 | 国产成人免费手机在线观看视频| 色欲人妻无码AV精品一区二区| 国产精品高潮呻吟AV久久96| 欧美另类老女人| 被爽到叫呻呤视频免费视频| 肉多荤文高h羞耻校园| 国产精品午夜小视频观看| 亚洲精品6久久久久中文字幕| 极品少妇高潮啪啪无码吴梦| 在线亚洲色拍偷拍在线视频| 免费人妻AV无码专区五月| yellow高清免费观看日本| 视频一区国产在线第一页| 国产亚洲精品久久久久久鸭绿欲| 亚洲视频一区| 蜜芽无码亚洲资源网站| 91嫩草视频在线观看| 秋霞电影网伦大理电影在线观看| 光棍天堂在线a| 亚洲精品另类有吗中文字幕| 久久久久婷婷国产综合青草| 99在线视频免费观看视频| 美女隐私黄www视频| 成人a毛片久久免费播放| 羞羞一区二区三区四区片|