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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 2.4 異步、并發 ## 異步 ### 應用程序及內核 Linux操作系統在設計上將虛擬空間劃分為用戶空間和內核空間,兩者做了隔離是相互獨立的,用戶空間給應用程序使用,內核空間給內核使用。內核具有最高權限,可以訪問受保護的內存空間,可以訪問底層的硬件設備。而這些是應用程序所不具備的,但應用程序可以通過調用內核提供的接口來間接訪問或操作。所謂的常見的IO模型就是基于應用程序和內核之間的交互所提出來的。以一次網絡IO請求過程中的read操作為例,請求數據會先拷貝到系統內核的緩沖區(內核空間),再從操作系統的內核緩沖區拷貝到應用程序的地址空間(用戶空間)。而從內核空間將數據拷貝到用戶空間過程中,就會經歷兩個階段: * 等待數據準備 * 拷貝數據 也正因為有了這兩個階段,才提出了各種網絡I/O模型。 ### 同步和異步 同步和異步的概念描述的是應用程序與內核的交互方式,同步是指應用程序發起I/O請求后需要等待或者輪詢內核I/O操作完成后才能繼續執行;而異步是指應用程序發起I/O請求后仍繼續執行,當內核I/O操作完成后會通知應用程序,或者調用應用程序注冊的回調函數。 ### 阻塞和非阻塞 阻塞和非阻塞的概念描述的是應用程序調用內核IO操作的方式,阻塞是指I/O操作需要徹底完成后才返回到用戶空間;而非阻塞是指I/O操作被調用后立即返回給用戶一個狀態值,無需等到I/O操作徹底完成。 ### 常見的網絡IO模型 1. 同步阻塞IO(Blocking IO) 進程發出IO請求后,進入阻塞狀態,直到內核返回數據,才重新繼續執行 2. 同步非阻塞IO(Non-blocking IO) 進程發出IO請求后,不阻塞,如果數據沒準備好,直接返回錯誤 3. IO多路復用(IO Multiplexing) IO復用阻塞在select、poll或epoll這樣的系統調用上,通過這種方式在不使用多線程的前提下,單個進程可以同時處理多個網絡連接的IO 4. 異步IO(Asynchronous IO) 在一個進程發出IO請求后直接返回,內核在整個操作(包括數據復制都進程緩存區)完成后通知進程 ## 并行 在操作系統中,一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。 ### 并發和并行的區別: * 并發(concurrency):邏輯上具備同時處理多個任務的能力 * 并行(parallesim):物理上在同一時刻執行多個并發任務,依賴多核處理器等物理設備 ### 并發編程模型 #### 多進程 進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。多進程是在操作系統層面進行并發的基本模式。同時也是開銷最大的模式。在Linux平臺上很多工具鏈正是采用這種模式在工作。比如某個Web服務器,它會有專門的進程負責網絡端口的監聽和鏈接管理,還會有專門的進程負責事務和運算。這種方法的好處在于簡單、進程間互不影響,壞處在于系統開銷大,因為所有的進程都是由內核管理的。 #### 多線程 線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是的)。多線程在大部分操作系統上都屬于系統層面的并發模式,也是我們使用最多的最有效的一種模式。目前我們所見的幾乎所有工具鏈都會使用這種模式。它比多進程的開銷小很多,但是其開銷依舊比較大,且在高并發模式下效率會有影響。 #### 基于回調的非阻塞/異步IO 這種架構的誕生實際上來源于多線程模式的危機,在很多高并發服務器開發實踐中,使用多線程模式會很快耗盡服務器的內存和CPU資源。而這種模式通過事件驅動的方式使用異步IO,使服務器持續運轉,且盡可能地少用線程,降低開銷,它目前在Node.js/PHP Swoole擴展中得到了很好的實踐。但是使用這種模式,編程比多線程要復雜,因為它把流程做了分割,對于問題本身的反應不夠自然。 #### 協程 協程英文“coroutine”,協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度。協程和線程的區別是:協程避免了無意義的調度,由此可以提高性能,但也因此,程序員必須自己承擔調度的責任,同時,協程也失去了標準線程使用多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>

                              哎呀哎呀视频在线观看