進(jìn)程,線程,協(xié)程,goroutine

一、進(jìn)程

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

特點(diǎn):

  • 進(jìn)程擁有獨(dú)立的堆棧,進(jìn)程之間堆棧資源不共享,由操作系統(tǒng)進(jìn)行調(diào)度,
  • 一個(gè)進(jìn)程可以包含多個(gè)線程,
  • 不同進(jìn)程間內(nèi)存難以共享,
  • 同一個(gè)進(jìn)程下,線程的數(shù)據(jù)可以共享
  • 進(jìn)程切換消耗較多的計(jì)算機(jī)資源,因?yàn)橐4娴亩褩P畔⒑蜕舷挛膬?nèi)容較多
  • 進(jìn)程使用搶占式調(diào)度方式,

進(jìn)程狀態(tài):

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

二、線程

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

線程特性:

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

線程狀態(tài)

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

三、協(xié)程

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

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

協(xié)程特性:

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

四、goroutine

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

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

五、進(jìn)程、線程比較

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

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

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

七、協(xié)程、goroutine

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

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

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