<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                在聽到Node的介紹時,我們時常會聽到異步、非阻塞、回調、事件這些詞語混合在一起推介出來,其中異步與非阻塞聽起來似乎是同一回事。從實際效果而言,異步和非阻塞都達到了我們并行I/O的目的。但是從計算機內核I/O而言,異步/同步和阻塞/非阻塞實際上是兩回事。 操作系統內核對于I/O只有兩種方式:阻塞與非阻塞。在調用阻塞I/O時,應用程序需要等待I/O完成才返回結果,如圖: ![](https://box.kancloud.cn/2016-08-28_57c1cec1ce66b.png) 阻塞I/O的一個特點是調用之后一定要等到系統內核層面完成所有操作后,調用才結束。以讀取磁盤上的一段文件為例,系統內核在完成磁盤尋道、讀取數據、復制數據到內存中之后,這個調用才結束。 阻塞I/O造成CPU等待I/O,浪費等待時間,CPU的處理能力不能充分利用。為了提高性能,內核提供了非阻塞I/O。非阻塞I/O跟阻塞I/O的差別為調用之后會立即返回,如圖: ![](https://box.kancloud.cn/2016-08-28_57c1cec1e0ec0.png) 操作系統對計算機進行了抽象,將所有輸入輸出設備抽象為文件。內核在進行文件I/O操作時,通過文件描述符進行管理,而文件描述符類似于應用程序與系統內核之間的憑證。應用程序如果需要進行I/O調用,需要先打開文件描述符,然后再根據文件描述符去實現文件數據的讀寫。此處非阻塞I/O與阻塞I/O的區別在于阻塞I/O完成整個獲取數據的過程,而非阻塞的I/O則不帶數據直接返回,要獲取數據,還需要通過文件描述符再次讀取。 非阻塞I/O返回之后,CPU的時間片可以用來處理其它事務,此時的性能提升是明顯的。 但非阻塞I/O也存在一些問題。由于完整的I/O并沒有完成,立即返回的不是業務層期望的數據,而僅僅是當前調用的狀態。為了獲取完整數據,應用程序需要重復調用I/O操作來確認是否完成。這種重復調用判斷操作是否完成的技術叫做輪詢,下面我們就來簡要介紹這種技術。 任意技術都并非完美的。阻塞I/O造成的CPU等待浪費,非阻塞帶來的麻煩卻是需要輪詢去確認是否完全完成數據獲取,它會讓CPU處理狀態判斷,是對CPU資源的浪費。這里我們且看輪詢技術是如何演進的,以減小I/O狀態判斷的CPU損耗。 現存的輪詢技術主要有以下這些: **read** 它是最原始的、性能最低的一種,通過重復調用來檢查I/O的狀態來完成完整數據的讀取。在得到最終數據前,CPU一直耗用在等待上。下圖是通過read進行輪詢的示意圖: ![](https://box.kancloud.cn/2016-08-28_57c1cec2002d0.png) **select** 它是在read基礎上改進的一種方案,通過對文件描述符上的事件狀態來進行判斷。通過select進行輪詢示意圖: ![](https://box.kancloud.cn/2016-08-28_57c1cec213513.png) select輪詢具有一個較弱的限制,那就是由于它采用了一個1024長度的數組來存儲狀態,所以它最多可以同時檢查1024個文件描述符。 **poll** 該方案較select有所改進,采用鏈表的方式避免數組長度的限制,其次它能避免不需要的檢查。但是當文件描述符較多的時候,它的性能還是十分低下的。通過poll實現輪詢的示意圖,它和select相似,但是性能有所改進: ![](https://box.kancloud.cn/2016-08-28_57c1cec22c83b.png) **epoll** 該方案是Linux下效率最高的I/O事件通知機制,在進入輪詢的時候如果沒有檢查到I/O事件,將會進行休眠,直到事件發生將它喚醒。它是真實利用了事件通知、執行回調的方式,而不是遍歷查詢,所以不會浪費CPU,執行效率較高。下圖為通過epoll方式實現輪詢示意圖: ![](https://box.kancloud.cn/2016-08-28_57c1cec241249.png) **kqueue** 該方案的實現方式與epoll類似,不過它僅在FreeBSD系統下存在。 輪詢技術滿足了非阻塞I/O確保獲取完整數據的要求,但是對于應用程序而言,它仍然只能算是一種同步,因為應用程序仍然需要等待I/O完全返回,依舊花費了很多時間來等待。等待期間,CPU要么用于遍歷文件描述符的狀態,要么休眠等待事件發生。結論就是它不夠好。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看