深入理解計算機概念 進程、線程、協程

1、CPU、CPU內核:

CPU:是中央處理器的簡稱,是計算機的運算和控制中心、是信息處理、程序運行的最終執行單元。
CPU內核 是CPU內的核心芯片,內核是CPU的計算引擎,由單晶硅製成,用來完成所有的計算、接受/存儲命令、處理數據等,是數字處理核心。核心(Die)又稱爲內核,是CPU最重要的組成部分。

2、單核CPU、多核CPU、多CPU:

單核CPU:就是系統只有一個CPU,內核只有一個。
多核CPU:就是系統只有一個CPU,但是有多個內核,就是在一個處理器內部集成了多個內核。
多CPU:就是系統上存在多個CPU,又稱爲多路CPU。
所謂的6核12線程,6核指的是物理核心,通過超線程技術,用一個物理核模擬兩個虛擬核,每個核兩個線程,總數爲8線程。在操作系統看來是12個核,但實際上還是6個核。超線程技術可以實現單個物理核的線程級並行運算。但性能不如兩個物理核。

3、併發、並行:

併發:是指系統具有處理多個任務的能力,大白話就是多個任務都在系統上運行,但是同一時刻只有一個任務在運行。系統會自己進行任務的快速輪換執行,看起來像是在同時運行。這個任務可以是進程,也可以是線程。
並行:是指系統具有同時運行多個任務的能力,大白話就是當系統有多個cpu(或多核CPU)時多個任務在此係統上可以同時運行。同一時刻可以有多個任務運行,前提是任務數要小等於CPU數,當大於CPU數時,程序表現爲併發運行。

4、CPU密集型任務、IO密集型任務:

CPU密集型任務:又稱計算密集型任務,要進行大量的計算,消耗CPU資源。如計算圓周率、加密解密、數據壓縮&解壓縮、音視頻處理等。
此時需要大量的計算,如果是多核CPU,使用多任務併發(也可以並行),可以充分發揮CPU性能。但是當任務過多時,花在任務上下文切換上的時間也會增加,反而會降低CPU處理性能。
因此合理的設置任務數量很重要,一般而言同時進行的任務要小等於CPU核心數爲佳。
因此在單核CPU下,CPU密集型任務使用併發不能提高效率,反而因爲任務切換而降低效率,但是此時併發可以其他任務執行,避免系統由於只執行單一任務,導致用戶無法使用系統。
由於主要消耗CPU資源,因此,代碼運行效率至關重要。要選用性能好效率高的語言,如C、C++。Python這樣的腳本語言運行效率很低,完全不適合計算密集型任務。

IO密集型任務:大量任務在網絡IO、磁盤IO等讀寫操作上,由於CPU速度要快的多,此時CPU屬於等待空閒狀態。如Web應用、網絡通信、讀寫數據庫等。
對於IO密集型任務,對CPU消耗很小,因此任務越多,CPU效率越高,但也有一個限度。
對於IO密集型任務,適合選用開發效率高的語言 如Python。
無論在單核或多核CPU下,使用併發處理IO密集型任務,都是可以提高效率的,它可以在其他任務等待時,讓系統處理其他任務,這樣可以有效提高處理效率。也方便了人機交互。

5、進程:

進程(process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,也就是系統進行資源管理的最小單元,是操作系統結構的基礎。
在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。
程序是指令、數據及其組織形式的描述,進程是程序的實體。
每一個進程都有它自己的地址空間,一般情況下,包括文本區域、數據區域和堆棧。
文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。

6、線程:

線程 (thread)有時被稱爲輕量級進程(Lightweight Process,LWP),是操作系統能夠進行運算調度的最小單位,是程序執行流的最小單元。
一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。
多個線程相對獨立,有自己的上下文,切換受系統控制
另外,線程是進程中的一個實體,是進程的執行單元,是被系統獨立調度和分派的基本單位。
線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,每個線程都運行在同一進程的上下文中,它可與同屬一個進程的其它線程共享進程所擁有的全部資源。

7、協程:

協程 (coroutine)與子例程(子例程是某個主程序的一部分代碼,該代碼執行特定的任務並且與主程序中的其他代碼相對獨立。子例程又被稱爲子程序、過程、方法、函數等。在主程序中可以調用子例程來執行。)一樣,協程 是比線程更小的執行單元,可以認爲是更加輕量級的線程。
正如一個進程可以擁有多個線程一樣,一個線程也可以擁有多個協程。
協程不是進程或線程,其執行過程更類似於子例程,或者說不帶返回值的函數調用。
一個程序可以包含多個協程,可以對比與一個進程包含多個線程,
因而下面我們來比較協程和線程。我們知道多個線程相對獨立,有自己的上下文,切換受系統控制;
而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。

8、進程、線程、協程的關係:

粒度大小:進程 > 線程 > 協程
一個系統可以運行多個進程
一個進程內可以有多個線程
一個線程內可以有多個協程

系統創建好進程後,實際上就啓動執行了該進程的執行主線程,主執行線程以函數地址形式,即程序入口函數比如說main()函數等,將程序的啓動點提供給系統。主執行線程終止了,進程也就隨之終止。
一個進程可由多個稱爲線程的執行單元組成,每個線程都運行在同一進程的上下文中,共享同樣的代碼和全局數據。每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。
用戶根據需要在應用程序中創建其它線程,多個線程併發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統資源。

一般認爲,操作系統可以併發執行多個進程/線程,當進程數 <= CPU核心數時 多進程是並行執行;當進程數 > CPU核心數時 多進程是併發執行。
線程併發執行:同一個進程裏的多線程可以併發執行,不同進程裏的多線程也可以併發執行,但多個線程併發都地運行於自己的進程中。注意每個進程只有一個線程的時,多進程 和 多線程是基本一樣的。
線程是它存在於進程中,是程序的實際執行者。一個進程至少包含一個主線程,也可以有更多的子線程。主線程由系統自動創建,用戶可以自行創建其他線程,
協程是一種程序組件,是比線程還小的執行單元,它存在於線程,比線程粒度更小 更靈活。
協程和線程的區別:線程的切換是系統控制的;協程的切換需要程序員調度,避免了無意義的調度,可以提高性能。但是協程也失去了標準線程使用多CPU的能力。但是在處理IO密集型時會提高效率。

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