<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之旅 廣告
                ## 動態棧 原生系統線程的棧是確定大小的,都是2M.但是goroutine的棧一般只有2k,比原生線程要小的多.得益于此,可以同時啟動成千上萬個goroutine. 但是goroutine的大小不是固定的,小至2k,大到1G. ## 原生線程調度 OS線程會被操作系統內核調度。每幾毫秒,一個硬件計時器會中斷處理器,這會調用一個叫作scheduler的內核函數。這個函數會掛起當前執行的線程并將它的寄存器內容保存到內存中,檢查線程列表并決定下一次哪個線程可以被運行,并從內存中恢復該線程的寄存器信息,然后恢復執行該線程的現場并開始執行線程。因為操作系統線程是被內核所調度,所以從一個線程向另一個“移動”需要完整的上下文切換,也就是說,保存一個用戶線程的狀態到內存,恢復另一個線程的到寄存器,然后更新調度器的數據結構。這幾步操作很慢,因為其局部性很差需要幾次內存訪問,并且會增加運行的cpu周期。 ## goroutine調度 Go的運行時包含了其自己的調度器,這個調度器使用了一些技術手段,比如m:n調度,因為其會在n個操作系統線程上多工(調度)m個goroutine。Go調度器的工作和內核的調度是相似的,但是這個調度器只關注單獨的Go程序中的goroutine(譯注:按程序獨立)。 和操作系統的線程調度不同的是,Go調度器并不是用一個硬件定時器,而是被Go語言“建筑”本身進行調度的。例如當一個goroutine調用了time.Sleep,或者被channel調用或者mutex操作阻塞時,調度器會使其進入休眠并開始執行另一個goroutine,直到時機到了再去喚醒第一個goroutine。因為這種調度方式不需要進入內核的上下文,所以重新調度一個goroutine比調度一個線程代價要低得多。 ## GOMAXPROCS Go的調度器使用了一個叫做GOMAXPROCS的變量來決定會有多少個操作系統的線程同時執行Go的代碼。其默認的值是運行機器上的CPU的核心數,所以在一個有8個核心的機器上時,調度器一次會在8個OS線程上去調度GO代碼。(GOMAXPROCS是前面說的m:n調度中的n)。在休眠中的或者在通信中被阻塞的goroutine是不需要一個對應的線程來做調度的。在I/O中或系統調用中或調用非Go語言函數時,是需要一個對應的操作系統線程的,但是GOMAXPROCS并不需要將這幾種情況計算在內。 **上面的意思就是,可以允許當前程序使用多少個原生的系統線程.因為協程是跑在OS線程上面的,當只分配了一個OS線程的時候,同時能運行的攜程數量也就只有1個了.**那么此時只能達到并發,而不能達到并行. ## goroutine沒有ID號 原生OS線程是有ID號的,所以可以根據當前線程的ID號,來做一些針對此線程的本地存儲. 但是協程是沒有ID號的,這樣設計的目的就是防止,本地存儲被濫用.
                  <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>

                              哎呀哎呀视频在线观看