1. 程式人生 > >協程 (Coroutine) 、程序(process)、執行緒(thread)的區別

協程 (Coroutine) 、程序(process)、執行緒(thread)的區別

    說到協程(Coroutine),我們必須提到兩個更遠的東西。在作業系統(os)級別,有程序(process)和執行緒(thread)兩個(僅從我們常見的講)實際的“東西”(不說概念是因為這兩個傢伙的確不僅僅是概念,而是實際存在的,os的程式碼管理的資源)。這兩個東西都是用來模擬“並行”的,寫作業系統的程式設計師通過用一定的策略給不同的程序和執行緒分配CPU計算資源,來讓使用者“以為”幾個不同的事情在“同時”進行“。在單CPU上,是os程式碼強制把一個程序或者執行緒掛起,換成另外一個來計算,所以,實際上是序列的,只是“概念上的並行”。在現在的多核的cpu上,執行緒可能是“真正並行的”。

 

    Coroutine,翻譯成”協程“,初始碰到的人馬上就會跟上面兩個概念聯絡起來。直接先說區別,Coroutine是編譯器級的,Process和Thread是作業系統級的。Coroutine的實現,通常是對某個語言做相應的提議,然後通過後成編譯器標準,然後編譯器廠商來實現該機制。Process和Thread看起來也在語言層次,但是內生原理卻是作業系統先有這個東西,然後通過一定的API暴露給使用者使用,兩者在這裡有不同。Process和Thread是os通過排程演算法,儲存當前的上下文,然後從上次暫停的地方再次開始計算,重新開始的地方不可預期,每次CPU計算的指令數量和程式碼跑過的CPU時間是相關的,跑到os分配的cpu時間到達後就會被os強制掛起。Coroutine是編譯器的魔術,通過插入相關的程式碼使得程式碼段能夠實現分段式的執行,重新開始的地方是yield關鍵字指定的,一次一定會跑到一個yield對應的地方。

 

1.程序

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。每個程序都有自己的獨立記憶體空間,不同程序通過程序間通訊來通訊。由於程序比較重量,佔據獨立的記憶體,所以上下文程序間的切換開銷(棧、暫存器、虛擬記憶體、檔案控制代碼等)比較大,但相對比較穩定安全。

 

2.執行緒

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源。執行緒間通訊主要通過共享記憶體,上下文切換很快,資源開銷較少,但相比程序不夠穩定容易丟失資料。

 

3.協程

協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。 協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧,直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數,所以上下文的切換非常塊。

 

 

協程與執行緒進行比較

1.一個執行緒可以多個協程,一個程序也可以單獨擁有多個協程。

2.執行緒程序都是同步機制,而協程則是非同步。

3.協程能保留上一次呼叫時的狀態,每次過程重入時,就相當於進入上一次呼叫的狀態。