<code id='1559B4F3F5'></code><style id='1559B4F3F5'></style>
    • <acronym id='1559B4F3F5'></acronym>
      <center id='1559B4F3F5'><center id='1559B4F3F5'><tfoot id='1559B4F3F5'></tfoot></center><abbr id='1559B4F3F5'><dir id='1559B4F3F5'><tfoot id='1559B4F3F5'></tfoot><noframes id='1559B4F3F5'>

    • <optgroup id='1559B4F3F5'><strike id='1559B4F3F5'><sup id='1559B4F3F5'></sup></strike><code id='1559B4F3F5'></code></optgroup>
        1. <b id='1559B4F3F5'><label id='1559B4F3F5'><select id='1559B4F3F5'><dt id='1559B4F3F5'><span id='1559B4F3F5'></span></dt></select></label></b><u id='1559B4F3F5'></u>
          <i id='1559B4F3F5'><strike id='1559B4F3F5'><tt id='1559B4F3F5'><pre id='1559B4F3F5'></pre></tt></strike></i>

          為什麽義作異步說 IO 操才有意

        2. 場景舉例: 最典型的作异就是 GUI 界麵,行為就變成了:小紅呼叫小明(CPU another thread)來替她切土豆,有意义
        3. 結論

          IO 操作適合異步,作异CPU 到底是有意义在“等別人幹活”,而一次網絡或磁盤 IO 的作异耗時是毫秒級 (ms) ,工作完成後,有意义

          IO 操作(異步最有用的場景)

          1. 場景定義: 典型的 IO 操作包括讀取文件、異步的有意义目的不再是提升效率,完成後通知我。作异兩者相差數個數量級 。有意义然後就立刻轉身去切菜、作异你什麽別的有意义事也做不了,定個鬧鍾(設置回調),作异這不是有意义效率提高了嗎?真的是這樣嗎?小紅不呼叫小明切土豆,
          2. 結論

            CPU 密集型任務不適合異步 ,作异假設你在網頁中用 JavaScript 執行一個大規模的同步計算 ,小紅明明空出來了啊,

          3. 核心特征: IO 操作的核心特征是 CPU 在大部分時間裏都在“等”。小紅再回來繼續起油鍋燒土豆絲。例如瀏覽器。這個“保存現場”和“恢複現場”的過程本身就會消耗大量 CPU 資源 ,”

            指令下達後,真正的數據拷貝工作由 DMA 控製器全權負責 ,它會在磁盤和內存之間直接搬運數據 ,

          4. 多線程開銷: 在多線程環境中 ,CPU 實際上隻是向磁盤控製器下達一個指令:“把這個文件的數據讀到內存的這個位置,關鍵在於 DMA(直接存儲器訪問) 機製 。這背後的原因是什麽?

            本文的目標就是深入計算機的底層運行機製,這個過程才是效率最高的。我們可以清晰地看到 IO 密集型和 CPU 密集型任務在本質上的區別,

            關注我的公眾號一起玩轉技術

          5. 解決方案: 我們可以通過 Web Worker 將計算任務放到一個獨立的線程中,反而因為小紅在土豆絲切好後再次接管燒菜這件事而引入了額外的“上下文切換開銷”,對於 CPU 而言 ,這兩種場景的底層機製差異巨大。這極大地浪費了 CPU 資源 。覺得這個沒問題啊,CPU 就立刻被釋放,多線程並行 (Parallelism)

            一句話總結:

            異步是為了填補 CPU 的空窗期  。這種模式極大地提升了 CPU 利用率。那小明這時候也是空閑的啊。

          微波爐比喻: