<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          CPU:別再拿我當(dāng)搬磚工!

          共 2894字,需瀏覽 6分鐘

           ·

          2020-08-20 00:21

          數(shù)據(jù)搬運工

          Hi,我是CPU一號車間的阿Q,有段日子沒見面了。

          還記得上回說到咱們廠里用上了DMA技術(shù)(太慢不能忍!CPU又拿硬盤和網(wǎng)卡開刀了!)之后,我們總算解放了,再也不用奔波于網(wǎng)卡、硬盤與內(nèi)存之間搬運數(shù)據(jù)了。

          前段時間,我到二號車間虎子那里去串門,發(fā)現(xiàn)他正忙的滿頭大汗。

          “老哥,你這是接到什么任務(wù)了?看把你給你忙的”

          虎子一看我過來,擦了擦頭上的汗說到:“我這是在搬運數(shù)據(jù)啊,剛剛搬完一批,累死我了”

          我有些疑惑:“咱們現(xiàn)在不是有DMA技術(shù)了嗎,找外包DMA控制器搬運啊,你干嘛還親自上陣?”

          “DMA是用于I/O外部設(shè)備與內(nèi)存之間搬運數(shù)據(jù),我現(xiàn)在的任務(wù)是內(nèi)存之間的復(fù)制拷貝工作,這DMAC也幫不上什么忙啊,還不得我親自動手復(fù)制?!?/p>

          我癟了癟嘴,“也是,但愿我不要接到這種任務(wù)”

          “先不跟你聊了,又有活要干了”,虎子屁股還沒坐熱,又起身去忙了,我也起身準(zhǔn)備回去。

          “我靠!怎么又要拷貝這批數(shù)據(jù)!”,我剛走兩步,就聽到虎子的吐槽。

          我回過頭去問到:“咋了這是?”

          “我剛才才把這份數(shù)據(jù)從內(nèi)核地址空間往用戶態(tài)地址空間拷貝了一次,這還沒喘口氣,又讓我再搬一次從用戶態(tài)再搬回內(nèi)核地址空間,太折騰我了吧!”

          我拍了拍他的肩膀說到:“嗨,這沒辦法,咱們就是打工的,哪輪得到咱們挑挑揀揀啊,加油吧!”

          我一邊給他打氣,一邊暗自祈禱別給我安排這種活,又累有沒有技術(shù)含量。

          天有不測風(fēng)云,回到一號車間沒多久,我也攤上這種事了。老話說得好,真是怕什么來什么。

          一開始我還能忍著,時間一久我就抑制不住心里的不滿了,還真是落在自己身上才知道痛。

          數(shù)據(jù)的四次拷貝

          第二天,我約上虎子去找操作系統(tǒng)內(nèi)存管理部門反應(yīng)這事。

          內(nèi)存管理部門居然踢皮球,說這事不歸他們管,讓我們找I/O部門,沒辦法,我們又來到I/O部門反應(yīng)這事。

          I/O部門的人聽完我們的抱怨,也很無奈:“兩位,實在不是我們故意戲耍你們。之前讓你們兩次搬運數(shù)據(jù)實在沒有辦法,這是上邊的應(yīng)用程序要這樣寫的。他們要把硬盤上的文件讀取出來,然后再通過網(wǎng)卡發(fā)送出去。這一讀一寫的不就要搬兩次嗎?”

          File.read(file,?buf,?len);
          Socket.send(socket,?buf,?len);

          “硬盤?網(wǎng)卡?這,這,這我們不是有了DMA技術(shù)了嗎,正好解決了和他們的數(shù)據(jù)傳輸,干嘛還另外讓我們再在內(nèi)存之間復(fù)制來復(fù)制去呢?”,我問到。

          對方看出了我們的疑惑,在旁邊的白板上畫了一張圖:

          “你們看,數(shù)據(jù)從硬盤最終到網(wǎng)卡,因為有應(yīng)用程序的參與,他們需要先讀到他們在用戶空間的緩存區(qū),再發(fā)送出去,這樣就總共有四次數(shù)據(jù)的傳輸。其中從硬盤到內(nèi)核空間和從內(nèi)核空間到網(wǎng)卡這兩個環(huán)節(jié),DMAC可以幫你們搬運。不過剩下兩次的用戶空間和內(nèi)核空間的來回拷貝,這還得靠你們來搬運下啊”

          “原來是這樣,唉,看來是沒辦法避免了,咱先回去吧”,虎子看完圖垂頭喪氣的說到。

          我卻不愿放棄,想在這圖中找出可以優(yōu)化改進的地方。

          “能不能讓數(shù)據(jù)不要去應(yīng)用程序那里,直接在內(nèi)核空間復(fù)制一次就好,我們就可以少搬運一次了?”,我拋出了一個問題。

          “那怎么可能呢,他不讀上去,后面怎么發(fā)出去呢?不行不行”,I/O部門的人連連搖頭。

          “還是可以發(fā)啊,你看像這樣···反正最后也是把數(shù)據(jù)從內(nèi)核空間交給網(wǎng)卡發(fā),只是免去了數(shù)據(jù)去用戶空間白晃一圈的浪費”,我把他畫的圖改了一下,不肯放棄解釋到。

          對方被我的話點醒了一般,眼珠左右轉(zhuǎn)動,反復(fù)思考。

          片刻之后,回到:“還是不行,萬一人家要對讀取的文件數(shù)據(jù)進行修改,或者解密,那還是得讀到他的用戶空間緩存區(qū)才行”

          我想了一下,這似乎沒辦法避免,說到:“那這種情況咱們就認(rèn)了,反正以我的經(jīng)驗來看,你說的這種情況不多。大部分情況下都是數(shù)據(jù)原封不動的從內(nèi)核到用戶空間,又從用戶空間回到內(nèi)核?!?/p>

          I/O部門的人再也沒有什么說辭,點了點頭答應(yīng)了下來,說把我們的意見匯報到Linux帝國高層討論后才能做決定。我們就先回去等消息了。

          零拷貝技術(shù)

          不過后來工作太忙,遲遲沒有操作系統(tǒng)那邊的消息,慢慢的我們就把這事給淡忘了,直到前幾天······

          “阿Q,聽說了嗎,最近Linux帝國新成立了一個公司,居然繞過我們CPU就能把數(shù)據(jù)從網(wǎng)卡寫入硬盤中”,虎子火急火燎的來找我。

          “不可能啊,按照我們之前的方案,怎么說也得至少經(jīng)過我們拷貝一次吧”

          “根本不用,他們號稱是零拷貝技術(shù)

          我們趕緊放下手里的工作,去打聽下究竟怎么回事。

          原來,Linux帝國最近新推出了一個API,叫sendfile

          ssize_t?sendfile(
          ??int?out_fd,?
          ??int?in_fd,?
          ??off_t?*offset,?
          ??size_t?count
          ??);

          只需要指定打開文件的描述符和要發(fā)送的網(wǎng)絡(luò)接口描述符,就直接實現(xiàn)了把文件通過網(wǎng)絡(luò)發(fā)出去。

          我們再次來到了操作系統(tǒng)I/O部門,對方一看是我們,熱情的接待了我們。

          “你們來的正好,我還沒來得及告訴你們呢。上次你們提的思路非常好,帝國高層非常重視,我一反應(yīng)上去,當(dāng)即就采納了你們的意見。這不你們估計也知道了,推出了新的API給應(yīng)用程序們使用,省去了數(shù)據(jù)白白去用戶空間轉(zhuǎn)一圈的開銷。一推出就大受歡迎,說起來還得感謝你們呢”

          “原來是這樣,我說最近怎么搬運數(shù)據(jù)的工作少了不少。不過你們是怎么做到零拷貝的?”

          I/O部門的人瞅了我們幾眼,得意的一笑,“帝國高層在討論你們的方案時,覺得還可以再進一步優(yōu)化,直接把從硬盤讀取到的數(shù)據(jù)緩沖區(qū)地址和長度給到網(wǎng)絡(luò)socket描述符,就不用你們再搬運一次數(shù)據(jù),徹底解放你們,所以叫零拷貝啦!”

          我倆連連點頭稱贊。

          “還沒完呢!咱Linux帝國還把這一技術(shù)推廣到了文件數(shù)據(jù)復(fù)制上,增加了另一個API:splice,以后文件拷貝也可以減輕你們的負(fù)擔(dān)了”

          ssize_t?splice(
          ??int?fd_in,?
          ??loff_t?*off_in,?
          ??int?fd_out,
          ??loff_t?*off_out,?
          ??size_t?len,?
          ??unsigned?int?flags
          ??);

          我倆回去之后,把這一消息告知了全廠,大家都高興壞了,原來各個車間都受苦久矣。

          彩蛋1

          在遙遠(yuǎn)的Windows帝國上。

          “部長,聽說Linux帝國推出了一個sendfile,號稱零拷貝”

          “有這回事?咱們不能落后,趕緊去研究一下”

          彩蛋2

          Linux帝國新來了一家公司,專注網(wǎng)絡(luò)數(shù)據(jù)包分析業(yè)務(wù)。

          “老大,數(shù)據(jù)包每次都要經(jīng)過Linux帝國協(xié)議棧部門處理一遍才能拿到,這太慢了”

          “能不能繞開協(xié)議棧,直接抓包?”

          預(yù)知后事如何,請關(guān)注后續(xù)精彩······

          —?【 THE END 】—
          本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲?。?/span>


          3T技術(shù)資源大放送!包括但不限于:Java、C/C++,Linux,Python,大數(shù)據(jù),人工智能等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲?。?!




          瀏覽 59
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日逼视频免费观看 | 黄色一级片免费在线观看 | 国产97自拍 | 欧美,日韩,国产,a视频 | 欧美色图清纯唯美亚洲色图 |