進程,線程,協(xié)程,goroutine

一、進程

進程是操作系統(tǒng)對正在運行程序的一種抽像, 是操作系統(tǒng)進行資源分配的基本單位

特點:

  • 進程擁有獨立的堆棧,進程之間堆棧資源不共享,由操作系統(tǒng)進行調(diào)度,
  • 一個進程可以包含多個線程,
  • 不同進程間內(nèi)存難以共享,
  • 同一個進程下,線程的數(shù)據(jù)可以共享
  • 進程切換消耗較多的計算機資源,因為要保存的堆棧信息和上下文內(nèi)容較多
  • 進程使用搶占式調(diào)度方式,

進程狀態(tài):

  • 初始態(tài)
  • 就緒狀態(tài)
  • 等待(阻塞)裝態(tài)
  • 執(zhí)行狀態(tài)
  • 終止?fàn)顟B(tài)

二、線程

現(xiàn)代操作系統(tǒng)中,一個進程實際上由多個稱為線程執(zhí)行單元組成,線程是操作系統(tǒng)進行調(diào)度的基本單位

線程特性:

  • 線層是操作系統(tǒng)進行調(diào)度的基本單位
  • 多個線程可以存在于一個進程中,
  • 同一進程中的線程可以共享虛擬內(nèi)存
  • 由于共享內(nèi)存,大多數(shù)時候線程要加上同步互斥鎖
  • 線程調(diào)度方式有分時調(diào)度(輪流使用cpu)搶占式調(diào)度(優(yōu)先讓優(yōu)先級高的線程使用cpu,優(yōu)先級相同時,隨機選擇一個)

線程狀態(tài)

線程狀態(tài)與進程狀態(tài)類似
  • 初始態(tài)
  • 就緒狀態(tài)
  • 等待(阻塞)裝態(tài)
  • 執(zhí)行狀態(tài)
  • 終止?fàn)顟B(tài)

三、協(xié)程

協(xié)程(coroutine)又叫微線程,一種輕量級線程,也可稱為用戶態(tài)線程,協(xié)程不受操作系內(nèi)核管理,完全由程序控制

協(xié)程不是進程或者線程,其執(zhí)行過程類似子例程,協(xié)程相對獨立,有自己的上下文,切換由自己控制,

協(xié)程特性:

  • 協(xié)程可以看成普通對象,當(dāng)前協(xié)程阻塞時可以讓當(dāng)前線程執(zhí)行其他協(xié)程
  • 協(xié)程對操作系統(tǒng)來說是透明的,操作系統(tǒng)無法直接感知并調(diào)度協(xié)程,所以線程是操作系統(tǒng)執(zhí)行調(diào)度的最小單位
  • 協(xié)程切換的開銷遠(yuǎn)小于線程

四、goroutine

goroutine是協(xié)程的go語言實現(xiàn)版,相當(dāng)于其他語言類庫提供的功能內(nèi)置到語言關(guān)鍵字支持,

goroutine本質(zhì)是協(xié)程,創(chuàng)建成本較?。?~4kb)

五、進程、線程比較

  1. 進程線程都是由操作系統(tǒng)進行調(diào)度,受cpu分時系統(tǒng)的影響, 進行搶占式調(diào)度
  2. 切換:進程切換涉及到虛擬內(nèi)存空間的切換,因為進程內(nèi)的線程共享內(nèi)存,所以線程切換不涉及虛擬內(nèi)存地址的切換,所以進程切換時間大于線程切換時間

六、線程,協(xié)程比較

  1. 協(xié)程是用戶態(tài)的輕量級線程,對操作系統(tǒng)內(nèi)核透明,所以協(xié)程調(diào)度與切換由用戶控制,
  2. 切換:協(xié)程切換完全在用戶空間進行,線程切換涉及特權(quán)模式切換,涉及到內(nèi)核空間
  3. 協(xié)程切換只涉及基本的cpu上下文切換,即寄存器中保存的狀態(tài)信息,協(xié)程切換就是把當(dāng)前寄存器狀態(tài)保存,將要切換進來的協(xié)程的寄存器狀態(tài)加載到CPU寄存器,此過程完全在用戶態(tài)進行
  4. 線程調(diào)度只有 擁有較高權(quán)限的內(nèi)核空間才可以完成,所以線程的切換涉及到用戶空間和內(nèi)核空間的切換,上下文多于協(xié)程

七、協(xié)程、goroutine

goroutine是協(xié)程的go語言實現(xiàn)
  1. go語言在runtime,系統(tǒng)調(diào)用等多方面對goroutine調(diào)度進行了封裝處理,即goroutine不完全由用戶控制,一定程度上由go runtime 管理,好處是當(dāng)goroutine阻塞時,會讓出CPU給其他goroutine
  2. 默認(rèn)情況下所有g(shù)oroutine在同一個原生線程里運行,即只使用一個CPU核心,
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容