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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## coroutine概述 golang提供了語言級別的協程、coroutine是云風用C寫的一個協程庫、libco是騰訊開源的一個C++協程庫。 在研究源碼前,先弄清楚幾個概念: 1.何為協程 2.協程種類 3.協程的使用和應用場景 ## 協程 vs 線程 * 線程是搶占式的,協程是非搶占式的。 * 線程數量通常不可以太多,而協程的數量可以非常多。如果線程的數量太多,那么大量線程的切換會影響性能。 * 協程的調度是應用代碼自己實現的,而線程的調度是操作系統實現的。 ## 何為協程 ### 基礎 1.協程可以理解成用戶態的輕量級線程,切換由用戶操作。 2.協程切換很快,不會陷入內核態。 3.協程擁有自己的寄存器上下文和棧, 協程調度切換時,將寄存器上下文和棧保存到其他地方,在切換回來的時候,恢復先前保存的寄存器上下文和棧。 ### 優點 1.**協程具有極高的執行效率 因為子程序切換不是線程切換,是由程序自身控制**,因此協程沒有線程切換的開銷, 多線程的線程數量越多,協程的性能優勢就越明顯。 2.**訪問共享資源不需要多線程的鎖機制**, 因為只有一個線程, 也不存在同時寫變量沖突, 所以在協程中控制共享資源無需加鎖, 只需要判斷狀態就好了,執行效率比多線程高很多, 而且代碼編寫難度也可以相應降低。 3.**以同步代碼的方式寫異步邏輯**, 但是協程實際上還是無法完全避免寫異步回調,因為我們需要在異步API的基礎上,結合協程庫,開發出“同步”的API。 ### 缺點 無法利用多核資源, 除非和多進程配合 ## 協程種類 ### 有棧協程(Stackfull) & 無棧協程(Stackless) * `Stackless`類型不保存調用棧以及寄存器等信息,不屬于真正的重入,因此一些局部變量都是無法使用的。 * `Stackfull`是真正的基于棧的重入,可以從某個嵌套的調用點上恢復執行。Stackfull協程在切換的時候,需要把當前的棧保存起來,以便在恢復的時候再次恢復執行,而`stackless`則不需要。 ### 連續棧 & 共享棧 ### 非對稱協程 & 對稱協程 協程按類型分為: * `非對稱式協程`,協程之間有調用鏈關系,一個協程A釋放控制權有2種方式 * 通過調用`yield`,將控制權返還給協程A的創建協程 * 通過調用`resume`,將控制權交給一個子協程 * `對稱式協程`,與`非對稱式協程`不同,各個協程之間可以互相轉移控制權,類似于goto語句,這種方式,即使非常有經驗的程序員也很難理清調用流程。同時該協程方式實現困難,性能不高。 業內實現的C/C++協程基本都采用`非對稱`的協程方式。 ## 協程的使用和應用場景 對于一些比較上層的應用,例如即時通信軟件,可能是比較合適的。 ### **進程、線程、協程的關系和區別:** * 進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。 * 線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是的)。 * 協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度。 libco上下文切換原理詳解: https://zhuanlan.zhihu.com/p/27409164 有棧協程和無棧協程: https://www.jianshu.com/p/2782f8c49b2a ucontext-人人都可以實現的簡單協程庫: https://blog.csdn.net/qq910894904/article/details/41911175?spm=1001.2014.3001.5501 libco :https://blog.didiyun.com/index.php/2018/11/23/libco/ 參考連接:https://www.cyhone.com/articles/analysis-of-libco/ https://coolshell.cn/articles/10975.html https://www.jianshu.com/p/2782f8c49b2a libco https://github.com/yyrdl/libco-code-study/blob/master/readme/coctx_swap_S.md
                  <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>

                              哎呀哎呀视频在线观看