首頁  >  文章  >  後端開發  >  go語言中執行緒和進程的差別是什麼

go語言中執行緒和進程的差別是什麼

青灯夜游
青灯夜游原創
2022-12-28 12:56:054310瀏覽

區別:1、執行緒是程式執行的最小單位,而行程是作業系統分配資源的最小單位。 2、一個行程由一個或多個執行緒組成,執行緒是一個行程中程式碼的不同執行路線。 3.線程上下文切換比進程上下文切換快得多。 4.行程切換需要的資源很最大,效率很低;執行緒切換需要的資源一般,效率一般。 5.進程擁有自己的堆疊,進程之間不共享堆疊;執行緒擁有自己的棧,共享堆。

go語言中執行緒和進程的差別是什麼

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

什麼是執行緒、行程?

進程

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

執行緒

是處理器調度和分配的基本單位

一個行程可以有一個或多個執行緒在各個執行緒之間共享程式的記憶體空間

  • 任務排程
  • 大部分作業系統(Windows、Linux)的任務排程採用

    時間片輪替的搶佔式排程方式
  • 此調度方式如下:

  • 在一個行程中,當一個執行緒任務執行幾毫秒後,會由作業系統核心進行調度

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

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

go語言中執行緒和進程的差別是什麼然後從記憶體中恢復該執行緒的暫存器,最後恢復該執行緒的執行,從而去執行下一個任務

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

並發
  • 程式與執行緒的差異
  • 執行緒是程式執行的最小單位,而行程是作業系統分配資源的最小單位

  • 一個行程由一個或多個執行緒組成,執行緒是一個行程中程式碼的不同執行路線

    #執行緒上下文切換比行程上下文切換快得多

程式切換需要的資源很最大,效率很低;執行緒切換需要的資源一般,效率一般。

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

執行緒擁有自己的棧,共享堆,也是由作業系統調度

多執行緒與多核心#多核心處理器

是指在一個處理器上集成了多個

運算核心從而提高運算能力。也就是有多個真正平行運算的處理核心,每個處理核心對應一個核心執行緒。

  • 核心執行緒
#每一個處理核心對應一個核心執行緒。

例如:

單核心處理器對應一個核心執行緒雙核心處理器對應兩個核心執行緒

四核心處理器對應四個核心執行緒核心執行緒(Kernel Thread,KLT)就是直接由作業系統核心支援的執行緒。該線程由核心來完成線程切換,核心透過操作調度器對線程進行調度,並負責將線程的任務映射到各個處理器上。

超執行緒技術

目前處理器都採用了

超執行緒技術go語言中執行緒和進程的差別是什麼將一個

物理處理核心

模擬成兩個邏輯處理核心,也就是兩個核心執行緒。

所以我們看到的電腦通常都是雙核心四線程、四核心八線程。

在作業系統中我們看到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影片教學程式設計教學

以上是go語言中執行緒和進程的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn