<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## Boost.Asio是什么 Boost.Asio是一個跨平臺的網絡庫 ## Boost.Asio怎么實現的 Linux下高性能網絡庫中大多使用的Reactor模式去實現,Boost.Asio在Linux下用epoll和select去模擬proactor模式,影響了它的效率和實現復雜度。為什么Boost.Asio使用Proactor模式呢?借用知乎上陳碩的回答來解釋: >Windows 下很難實現高效可伸縮的 Reactor。首先,Win32 API 里 WaitForMultipleObjects 只能同時等待 64 個 handle (MAXIMUM\_WAIT\_OBJECTS);其次 WinSock 的 select() 實現又很 buggy,特別是在錯誤處理方面有很多奇葩行為(具體見各種跨平臺網絡庫代碼中對此的注釋);最后,Windows Vista 新增的 WSAPoll() 函數與 POSIX 的 poll() 又不盡兼容( [http://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/](https://link.zhihu.com/?target=http%3A//daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/) )。 >Windows 有自己的一套高效異步IO模型(幾乎等同于Proactor),同時支持文件IO和網絡IO;但 Linux 只有高效的網絡同步IO(epoll 之類的 io multiplexing 是同步的Reactor,且不支持磁盤文件),二者的高效IO編程模型從根本上不兼容(Windows 可以把網絡事件發到 GUI 線程的事件隊列中,有點類似 Reactor,但是似乎一個進程只能有一個 GUI 線程,因此在多核系統上其伸縮性受限)。 因此,ASIO 要想高效且跨平臺,只能用 Proactor 模型了。不可避免地會在 Linux 上損失一點兒效率。 ## 為什么 Proactor 是最佳模型? * 跨平臺 許多操作系統都有異步API,即便是沒有異步API的Linux, 通過 epoll 也能模擬 Proactor 模式。 * 支持回調函數組合 將一系列異步操作進行組合,封裝成對外的一個異步調用。這個只有Proactor能做到,Reactor 做不到。意味著如果asio使用Reactor模式,就對不起他“庫” 之名。 * 相比 Reactor 可以實現 Zero-copy * 和線程解耦。 長時間執行的過程總是由操作系統異步完成,應用程序無需為此開啟線程。 Proactor 也并非全無缺點,缺點就是內存占用比 Reactor 大。**Proactor 需要先分配內存而后處理IO**, 而 **Reactor 是先等待 IO 而后分配內存**。相對的Proactor卻獲得了Zero-copy好處。因為內存已經分配好了,因此操作系統可以將接受到的網絡數據直接從網絡接口拷貝到應用程序內存,而無需經過內核中轉。
                  <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>

                              哎呀哎呀视频在线观看