一、進程
進程是操作系統(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)
五、進程、線程比較
- 進程線程都是由操作系統(tǒng)進行調(diào)度,受
cpu分時系統(tǒng)的影響, 進行搶占式調(diào)度 - 切換:進程切換涉及到
虛擬內(nèi)存空間的切換,因為進程內(nèi)的線程共享內(nèi)存,所以線程切換不涉及虛擬內(nèi)存地址的切換,所以進程切換時間大于線程切換時間
六、線程,協(xié)程比較
- 協(xié)程是用戶態(tài)的輕量級線程,對操作系統(tǒng)內(nèi)核透明,所以協(xié)程調(diào)度與切換由用戶控制,
- 切換:協(xié)程切換完全在
用戶空間進行,線程切換涉及特權(quán)模式切換,涉及到內(nèi)核空間 - 協(xié)程切換只涉及基本的cpu上下文切換,即寄存器中保存的狀態(tài)信息,協(xié)程切換就是把當(dāng)前
寄存器狀態(tài)保存,將要切換進來的協(xié)程的寄存器狀態(tài)加載到CPU寄存器,此過程完全在用戶態(tài)進行 - 線程調(diào)度只有 擁有較高權(quán)限的
內(nèi)核空間才可以完成,所以線程的切換涉及到用戶空間和內(nèi)核空間的切換,上下文多于協(xié)程
七、協(xié)程、goroutine
goroutine是協(xié)程的go語言實現(xiàn)
- go語言在
runtime,系統(tǒng)調(diào)用等多方面對goroutine調(diào)度進行了封裝處理,即goroutine不完全由用戶控制,一定程度上由go runtime 管理,好處是當(dāng)goroutine阻塞時,會讓出CPU給其他goroutine - 默認(rèn)情況下所有g(shù)oroutine在同一個原生線程里運行,即只使用一個CPU核心,