<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:別再拿我當搬磚工!

          共 2866字,需瀏覽 6分鐘

           ·

          2020-08-12 07:42

          數據搬運工

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

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

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

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

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

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

          “DMA是用于I/O外部設備與內存之間搬運數據,我現在的任務是內存之間的復制拷貝工作,這DMAC也幫不上什么忙啊,還不得我親自動手復制。”

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

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

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

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

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

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

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

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

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

          數據的四次拷貝

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

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

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

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

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

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

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

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

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

          “能不能讓數據不要去應用程序那里,直接在內核空間復制一次就好,我們就可以少搬運一次了?”,我拋出了一個問題。

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

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

          對方被我的話點醒了一般,眼珠左右轉動,反復思考。

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

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

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

          零拷貝技術

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

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

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

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

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

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

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

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

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

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

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

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

          我倆連連點頭稱贊。

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

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

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

          彩蛋1

          在遙遠的Windows帝國上。

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

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

          彩蛋2

          Linux帝國新來了一家公司,專注網絡數據包分析業(yè)務。

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

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

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

          往期TOP5文章

          太慢不能忍!CPU又拿硬盤和網卡開刀了!

          因為一個跨域請求,我差點丟了飯碗

          完了!CPU一味求快出事兒了!

          哈希表哪家強?幾大編程語言吵起來了!

          一個HTTP數據包的奇幻之旅


          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  学生妹一级片,黄色的学生妹一级片 | 欧洲级毛片内射 | 亚洲无码五月丁香 | 99久热| 三级片天天干 |