<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                linux**不支持**原生線程,windows,solaris支持線程 ## 同步通信 異步通信 同步通信:通信雙方需要同步時鐘信號,建立連接,發送數據后等待對方接收完成。 異步通信:通信雙方不需要同步時鐘信號,發送數據后不考慮對方是否接收 ## 同步(synchronous)和異步(asynchronous) >[info]同步和異步關注被調用者通知調用者的消息通知機制 * 同步IO:調用發出不會立即返回,但一旦返回就可以返回最終結果; * 異步IO:調用發出之后,被調用方立即返回消息,但返回的非最終結果;被調用者通過狀態、通知機制來通知調者,或通過回調函數來處理結果; ## 阻塞(block)和非阻塞(non-block) >[info]關注的是調用者等調用結果(消息、返回值)時的狀態 * 阻塞:調用結果返回之前,調用者(調用線程)會被掛起;調用者只有在得到結果之后才會返回; * 非阻塞:調用結果返回之前,調用不會阻塞當前線程; ## 多進程 * 每個請求啟動一個進程 * 進程量大,進程切換次數很多 * 每隔進程的地址空間是獨立的,很多空間是重復的數據,因此內存利用率很低 ## 多線程 * 每個線程響應一個請求: * 線程切換較進程為輕量級切換 * 進程內的許多資源可以在線程間共享 >[info]多進程多線程:需要結合進程和CPU的綁定可以發揮更好的效果 ## 忙等 閑等 忙等:自旋鎖,spin lock,不退出CPU,等待IO等資源到位 閑等:退出CPU,等待IO等資源到位 ## I/O動作如何執行? 進程無法直接操作I/O設備,其必須通過系統調用請求kernel來協助完成I/O動作 內核會為每個I/O設備維護一個buffer ![](http://om4h63cja.bkt.clouddn.com/17-7-21/98285961.jpg) 對于輸入而言,等待(wait)數據輸入至buffer需要時間,而從buffer復制(copy)數據至進程也需要時間 根據等待模式不同,I/O動作可分為五種模式: * 阻塞I/O:blocking I/O, blocked all the way * 非阻塞I/O:nonblocking I/O,if no data in buffer, immediate returns EWOULDBLOCK * I/O復用:I/O multiplexing (select and poll), blocked separately in wait and copy * 信號驅動I/O:signal driven I/O (SIGIO), nonblocked in wait but blocked in copy (signaled when I/O can be initiated) * 異步I/O:asynchronous I/O (aio_),nonblocked all the way (signaled when I/O is complete) ### 阻塞I/O 在一個進程發出IO請求后,進入阻塞狀態,直到內核返回數據,才重新運行,如圖: ![](http://om4h63cja.bkt.clouddn.com/17-7-21/80519944.jpg) ![](http://om4h63cja.bkt.clouddn.com/17-7-21/22299496.jpg) ### 非阻塞I/O 在一個進程發出IO請求后,不阻塞,如果數據沒有準備好,就直接返回錯誤碼,如圖: ![](http://om4h63cja.bkt.clouddn.com/17-7-21/25168489.jpg) ![](http://om4h63cja.bkt.clouddn.com/17-7-21/97133573.jpg) ### I/O復用 IO復用阻塞在select、poll或epoll這樣的系統調用上,通過這種方式,在不使用多線程的前提下,單個進程可以同時處理多個網絡連接的IO。如圖: ![](http://om4h63cja.bkt.clouddn.com/17-7-21/87977021.jpg) ![](http://om4h63cja.bkt.clouddn.com/17-7-21/72240569.jpg) ### 事件驅動I/O #### 通知機制 * 通知水平觸發:多次通知,直到process從kernel buffer中將數據復制完成 * 通知邊緣觸發:通知一次后即使process未從kernel buffer中將數據取走,也不再通知 使用信號驅動I/O時,當網絡套接字可讀后,內核通過發送SIGIO信號通知應用進程,于是應用可以開始讀取數據。如圖: ![](http://om4h63cja.bkt.clouddn.com/17-7-21/28121111.jpg) ![](http://om4h63cja.bkt.clouddn.com/17-7-21/49984786.jpg) >[info]內存映射:mmqp,kernel buffer直接將I/O設備中的數據映射給process,并非復制 ### 異步I/O 在一個進程發出IO請求后直接返回,內核在整個操作(包括將數據復制到進程緩沖區)完成后通知進程,如圖: ![](http://om4h63cja.bkt.clouddn.com/17-7-21/28588738.jpg) ![](http://om4h63cja.bkt.clouddn.com/17-7-21/8252501.jpg)
                  <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>

                              哎呀哎呀视频在线观看