什麼是程式和執行緒?
程式是應用程式的啟動例項,程式擁有程式碼和開啟的檔案資源、資料資源、獨立的記憶體空間。
執行緒從屬於程式,是程式的實際執行者,一個程式至少包含一個主執行緒,也可以有更多的子執行緒,執行緒擁有自己的棧空間。
作業系統中的程式和執行緒
對作業系統而言,執行緒是最小的執行單元,程式是最小的資源管理單元。無論是程式還是執行緒,都是由作業系統所管理的。
執行緒的狀態
執行緒具有五種狀態:初始化、可執行、執行中、阻塞、銷燬
執行緒狀態的轉化關係
執行緒之間是如何進行協作的呢?
最經典的例子是生產者/消費者模式,即若干個生產者執行緒向佇列中系欸如資料,若干個消費者執行緒從佇列中消費資料。
生產者/消費者模式
生產者/消費者模式的效能問題是什麼?
- 涉及到同步鎖
- 涉及到執行緒阻塞狀態和可執行狀態之間的切換
- 設定到執行緒上下文的切換
什麼是協程呢?
協程(Coroutines)是一種比執行緒更加輕量級的存在,正如一個程式可以擁有多個執行緒一樣,一個執行緒可以擁有多個協程。
作業系統中的協程
協程不是被作業系統核心所管理的,而是完全由程式所控制,也就是在使用者態執行。這樣帶來的好處是效能大幅度的提升,因為不會像執行緒切換那樣消耗資源。
協程不是程式也不是執行緒,而是一個特殊的函式,這個函式可以在某個地方掛起,並且可以重新在掛起處外繼續執行。所以說,協程與程式、執行緒相比並不是一個維度的概念。
一個程式可以包含多個執行緒,一個執行緒也可以包含多個協程。簡單來說,一個執行緒內可以由多個這樣的特殊函式在執行,但是有一點必須明確的是,一個執行緒的多個協程的執行是序列的。如果是多核CPU,多個程式或一個程式內的多個執行緒是可以並行執行的,但是一個執行緒內協程卻絕對是序列的,無論CPU有多少個核。畢竟協程雖然是一個特殊的函式,但仍然是一個函式。一個執行緒內可以執行多個函式,但這些函式都是序列執行的。當一個協程執行時,其它協程必須掛起。
程式、執行緒、協程的對比
- 協程既不是程式也不是執行緒,協程僅僅是一個特殊的函式,協程它程式和程式不是一個維度的。
- 一個程式可以包含多個執行緒,一個執行緒可以包含多個協程。
- 一個執行緒內的多個協程雖然可以切換,但是多個協程是序列執行的,只能在一個執行緒內執行,沒法利用CPU多核能力。
- 協程與程式一樣,切換是存在上下文切換問題的。
上下文切換
程式的切換者是作業系統,切換時機是根據作業系統自己的切換策略,使用者是無感知的。程式的切換內容包括頁全域性目錄、核心棧、硬體上下文,切換內容儲存在記憶體中。程式切換過程是由“使用者態到核心態到使用者態”的方式,切換效率低。
執行緒的切換者是作業系統,切換時機是根據作業系統自己的切換策略,使用者無感知。執行緒的切換內容包括核心棧和硬體上下文。執行緒切換內容儲存在核心棧中。執行緒切換過程是由“使用者態到核心態到使用者態”, 切換效率中等。
協程的切換者是使用者(程式設計者或應用程式),切換時機是使用者自己的程式所決定的。協程的切換內容是硬體上下文,切換記憶體儲存在使用者自己的變數(使用者棧或堆)中。協程的切換過程只有使用者態,即沒有陷入核心態,因此切換效率高。
本作品採用《CC 協議》,轉載必須註明作者和本文連結