前言:
最近在學習golang語法特性,golang和其它語言最大區別莫過於goroutine,這塊知識點博主已經太久沒有溫固,對協程認知已經處於盲點。因此本文主要帶你認知操作系統中進程、線程、協程。
進程
在Window系統中,打開任務管理器,你可以看到當前操作系統中正在運行的進程詳細信息。
在Linux系統中,運行top命令,你可以看到當前操作系統中正在運行的進程詳細信息。
因此在三程中,進程是最容易直觀理解的對象:進程是程序的基本執行實體。當程序開始運行時,操作系統將爲進程分配一個內存結構體給程序,該結構體定義爲:
此外,操作系統將爲進程分配CPU時間片。因此,對操作系統來講,進程是資源分配的最小單位。
進程在操作系統中共有五種狀態:
1.創建狀態
程序啓動,操作系統爲其進程分配內存結構體等資源後,插入到運行隊列中。
2.就緒狀態
進程獲取除CPU使用權限外的所有必要資源。當操作系統有多個進程處於就緒狀態時,按照一定策略分配CPU使用權限。
3.運行狀態
進程獲得CPU使用權限,開始進行程序內部邏輯操作。對於CPU來說,同一時刻,每個核心只能處理一個進程。
4.阻塞狀態
進程發生阻塞,比如IO請求等。當前進程不在執行邏輯操作,操作系統會將CPU使用權限分配給其他就緒狀態的進程。
5.終止狀態
程序運行結束,操作系統收回分配給進程的資源。
線程
1、對操作系統來講,線程是能夠進行運算調度的最小單位。
2、進程是線程的容器,線程是進程實際運行的單位。因此進程至少用於一個線程(主線程)。
3、單個進程,可以擁有多個線程,線程間共享進程資源。
4、單個進程的多個線程可以併發運行。
5、對於操作系統來說,開啓線程的性價比高於進程,以此我們在處理併發業務時,一般使用多線程開發。
協程
1、一個線程可以擁有多個協程。協程不是被操作系統所管理的,而是完全由程序所控制。這樣帶來的好處是性能大幅度的提升,因爲不會像線程切換那樣消耗資源。
2、因爲線程是能夠進行運算調度的最小單位,所以線程內部多個協程是串行運行。因此提升CPU核心數量,不能夠提升協程效率。
3、因爲多線程共享進程資源,因此線程間訪問資源需要加線程讀寫鎖。但是多協程編程,只有一個線程,不存在資源同時訪問,因此對於共享資源不需要加鎖,執行效率要高的多。
協程是由程序進行控制,因此每個協程庫所使用的模型可能並不相同。下面介紹一下golang中的協程模型。
GOLANG協程模型
1、每一個線程都綁定一個處理器,線程在運行期間會從處理器的協程隊列中,獲取協程執行。
2、全局協程隊列會和各個處理器協程隊列互相交換協程
3、線程運行協程切換時間是10ms,也就是說 協程 最多執行10ms就會被 M 切換到下一個協程。
4、協程10ms運行完被線程中斷後。將寄存器裏的棧信息,保存到自己的 協程對象裏面。