淺談操作系統中進程、線程、協程的聯繫

前言:

最近在學習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運行完被線程中斷後。將寄存器裏的棧信息,保存到自己的 協程對象裏面。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章