<dd id="3pk9i"><optgroup id="3pk9i"><video id="3pk9i"></video></optgroup></dd>
<rp id="3pk9i"></rp>

<dd id="3pk9i"><track id="3pk9i"></track></dd>
      1. <th id="3pk9i"></th>
        1. <ol id="3pk9i"><ruby id="3pk9i"></ruby></ol>

        2. go語言中線程和進程的區別是什么-環球頭條

          來源:php中文網 | 2022-12-28 13:04:22 |

          本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

          什么是線程、進程?

          進程


          (資料圖片)

          是一個具有一定獨立功能的程序在一個數據集上的一次動態執行過程是操作系統進行資源分配和調度的一個獨立單位是應用程序的運行的載體

          線程

          線程是程序執行中一個單一的順序控制流程是程序執行流的最小單位是處理器調度和分配的基本單位一個進程可以有一個或多個線程各個線程之間共享程序的內存空間

          任務調度

          大部分操作系統(Windows、Linux)的任務調度采用時間片輪轉的搶占式調度方式。 該調度方式如下:

          在一個進程中,當一個線程任務執行幾毫秒后,會由操作系統內核進行調度

          通過硬件的計數器中斷處理器,讓該線程強制暫停并將該線程的寄存器放入內存中

          通過查看線程列表決定接下來執行哪一個線程

          然后從內存中恢復該線程的寄存器,最后恢復該線程的執行,從而去執行下一個任務

          這種方式保證了每個線程輪流執行,由于CPU的執行效率非常高,時間片非常短,在各個任務之間快速地切換,給人的感覺就是多個任務在同時進行,這就是我們說的并發。

          進程和線程的區別

          線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位

          一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線

          線程上下文切換比進程上下文切換要快得多

          進程切換需要的資源很最大,效率很低;線程切換需要的資源一般,效率一般。

          進程擁有自己的堆棧,進程之間不共享堆棧,由操作系統調度

          線程擁有自己的棧,共享堆,也是由操作系統調度

          多線程和多核

          多核處理器是指在一個處理器上集成了多個運算核心從而提高計算能力。也就是有多個真正并行計算的處理核心,每一個處理核心對應一個內核線程。

          內核線程

          每一個處理核心對應一個內核線程。比如:

          單核處理器對應一個內核線程雙核處理器對應兩個內核線程四核處理器對應四個內核線程

          內核線程(Kernel Thread,KLT)就是直接由操作系統內核支持的線程。該線程由內核來完成線程切換,內核通過操作調度器對線程進行調度,并負責將線程的任務映射到各個處理器上。

          超線程技術

          目前處理器都采用了超線程技術將一個 物理處理核心模擬成兩個邏輯處理核心,也就是兩個內核線程。 所以我們看到的電腦一般都是雙核四線程、四核八線程。 在操作系統中我們看到CPU數量是實際物理CPU數量的兩倍,如雙核四線程可以看到4CPU。

          如我當前編寫文章的這臺mbp就是i7 6核12線程:

          程序一般不會直接使用內核線程,而是使用內核線程的一種高級接口—輕量級進程(Lightweight Process,LWP),也就是我們常說的線程。

          協程

          協程(Coroutines)基于線程之上,比線程更加輕量級。一個線程可以擁有多個協程。

          協程的目的

          傳統應用中一般有會給網絡請求創建一個線程去完成業務邏輯。如果是多個請求,就會創建多個線程來出來。 如果遇到很耗時的I/O行為,線程就會一直處于阻塞狀態,如果很多線程都是出于這種空閑狀態(等待該線程執行完成才能執行),這樣就會造成資源應用不徹底,系統的吞吐能力下降。

          最常見的很耗時的I/O行為比如JDBC,CPU會一直等待數據I/O操作的返回,這時線程根本沒有利用CPU去做運算,而是處于空閑狀態。同時使用過多的線程,也會帶來更多的上下文切換開銷。

          解決上述問題有兩個方案:

          單線程加上異步回調 比如Node.js、Java的Vert.x協程 協程的目的就是當出現長時間I/O操作時,讓出當前的協程調度,執行下一個任務,來消除ContexSwith的開銷

          協程的特點

          線程切換由操作系統負責調度,協程由用戶自己調度,因此減少了上下文切換,提高了效率線程默認Stack大小為1M,而協程更輕量,接近1K。因此可以在相同的內存中開啟更多的協程由于協程在同一線程上,因此可以避免競爭關系二使用鎖適用于被阻塞且需要大量并發的場景。但不適用于大量計算的多線程

          協程的原理

          協程的流程:

          當出現I/O阻塞的時候,由協程的調度器進行調度

          通過將數據流立刻yield掉(主動讓出),并記錄當前棧上的數據

          阻塞完成后立刻在通過線程恢復棧,并把阻塞的結果放到這個線程上去跑

          而跑在由Coroutine負責調度的線程稱為Fiber,比如Golang里的go關鍵字其實就是負責開啟一個Fiber,讓func邏輯跑在上面。

          由于協程的暫停完全由程序控制,發生在用戶態上;而線程的阻塞狀態是由操作系統內核來進行切換,發生在內核態上。 因此協程的開銷遠遠小于線程,也就沒有上下文切換的開銷。

          線程和協程的比較

          比較項線程協程
          占用資源初始單位為1MB,固定不可變初始一般為2KB,可隨需要增大
          調度所屬有OS內核完成由用戶完成
          切換開銷設計模式切換(從用戶態切換到內核態),16個寄存器、PC、SP等寄存器的刷新只有三個寄存器的值修改:PC、SP、DX
          性能問題資源占用太高,頻繁創建銷毀會帶來嚴重的性能問題資源占用小,不會帶來嚴重的性能問題
          數據同步需要鎖等機制確保數據的一致性和可見性不需要多線程的鎖機制,因此只有一個線程。也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比線程高很多

          以上就是go語言中線程和進程的區別是什么的詳細內容,更多請關注php中文網其它相關文章!

          關鍵詞: go語言 Golang

          中文字幕在线观看2021
          <dd id="3pk9i"><optgroup id="3pk9i"><video id="3pk9i"></video></optgroup></dd>
          <rp id="3pk9i"></rp>

          <dd id="3pk9i"><track id="3pk9i"></track></dd>
            1. <th id="3pk9i"></th>
              1. <ol id="3pk9i"><ruby id="3pk9i"></ruby></ol>