1. 程式人生 > >線程、進程(2)----- 從計算機物理層面分析

線程、進程(2)----- 從計算機物理層面分析

height 示例 電路 14. 模塊 物理層 就是 最大線程數 運行

一、從計算機的發展說起:

① 真空管與穿孔卡片

輸入一個指令,輸出一個結果

技術分享圖片

② 晶體管和批處理系統

攢成一大波輸入(批處理指令),然後順序計算

技術分享圖片

③ 集成電路芯片和多道程序設計

開發出多道程序設計,將內存分為幾個部分,每一部分存放不同的作業,如圖所示。當一個作業等待IO完成時,另一個作業可以 使用CPU,內存中放足夠的作業,則CPU的利用率能接近100%。(並發)

技術分享圖片

④ 個人計算機

大規模集成電路時代,實現了多線程,多核心,進入個人PC時代。


二、 線程和進程

1. 線程的由來

第三代計算機中,每一個進程處理一個程序,(單核+多道)實際上實現了多進程的並發處理,。

進程的定義:

進程就是一個程序在一個數據集上的一次動態執行過程。 進程一般由程序

數據集進程控制塊三部分組成。(程序,是一組指令的有序集合,可以理解成第二代計算機中的批處理指令)

這樣做法雖然說進程之間是並行的,但是進程內部還是串行的,也就是說,如果進程內部一條指令發生阻塞(阻塞),那麽同樣會導致這個進程進行不下去,那麽為了解決這個問題,就引入了線程這個概念,就是把進程進一步的細分為一個個線程,線程之間來回切換執行,這樣我們系統調度的最小單位就變為了線程。

線程的出現:

① 是為了降低上下文切換的消耗,

② 提高系統的並發性,並突破一個進程只能幹一樣事的缺陷, 使到進程內並發成為可能。

2. 線程和進程的關系

① 一個程序至少有一個進程,一個進程至少有一個線程.(進程可以理解成線程的容器);
② 進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,各個線程共享資源;
③ 進程是資源分配和調度的最小單位,線程是是CPU調度和分派的基本單位,是進程的一個實體;

技術分享圖片

3. 多線程

  • 進程之間,變量不共享,涉及到通信的問題,一般使用消息隊列(此外還有管道,信號量等)
  • 線程之間,多個線程修改同一個變量,涉及到同步的問題,使用鎖來解決。

----- 示例程序:Python並發復習2 - 多線程模塊threading的《生產者消費者模型》的多線程、多進程兩種實現方式。

技術分享圖片

4. 多核心CPU的進程和線程

在單核時代實際上只能實現並發處理,即:

采取分時的方式,即把CPU的時間分成很多片段,某個時間片只能執行某個線程,雖然說從操作系統和CPU的角度來說還是串行處理的,但是由於CPU的處理速度很快,從用戶的角度感覺是並行的。

隨著計算機的發展,出現了多核cpu,實現了並行處理,如下圖,多個線程之間不存在對CPU的搶占關系,而是微觀上同時執行。

技術分享圖片

此處補充一下CPU核心數線程數的概念:

  • CPU的核心數是指物理上,也就是硬件上存在著幾個核心。比如,雙核就是包括2個相對獨立的CPU核心單元組,四核就包含4個相對獨立的CPU核心單元組。
  • 線程數是一種邏輯的概念。通常來說,一個計算機核心在一瞬間只能執行一個線程,但是使用超線程技術(Intel才有,酷睿全系和誌強部分處理器支持),一個核心可以同時運行兩個線程,因此,線程數總是大於或等於核心數的。


三、 結論

綜上分析,對於我們常見的CPU(多核心), 結論如下:

  • Python和C/C++都是使用計算機的原生線程,因此在不考慮超線程技術的情況下,同時執行的最大線程數 == 計算機核心數
  • 對於計算密集型模擬軟件(如Fluent, EDEM等),需要查看CPU所用模擬軟件(To Hky: OpenFoam not supported)是否支持超線程,否則設置最大線程數等於總核心數,即可發揮最大性能。


參考博客:

  • CPU個數、CPU核心數、CPU線程數
  • 計算機發展史--》進程---》線程
  • 網絡編程與並發-線程、進程、協程

線程、進程(2)----- 從計算機物理層面分析