關於並行開發的一些概念整理

2023-07-12 06:00:31

〇、前言

想很好的理解並行開發,需要了解的知識還是有很多的,下邊就簡單羅列幾個概念。

一、相關概念簡介

1、工作管理員中的 基準速度、插槽、核心、邏輯處理器

基準速度

  就是處理器電晶體開啟和關閉的速率,也就是 CPU 運作的參考速度。聽起來像是速度越快越好,但是也有一定的侷限性,也需要合適體量的核心才能發揮效用,另外速度的提高也伴隨著更高的能耗。

插槽

  指的是主機支援插入幾個物理 CPU。

核心

  又叫物理核心,一個物理 CPU 可以包含多個物理核心。

邏輯處理器

  即邏輯 CPU,一個物理核心可以包含多個邏輯 CPU。計算機裝置管理器中顯示的處理器個數對應的就是邏輯處理器的個數。

舉個例子:

  如下圖,因為只有一個插槽,所以就只能裝機一個物理 CPU,然後一個物理 CPU 包含 6 個物理核心,一個核心中包含兩個邏輯處理器,即 1 x 6 x 2 = 12。

  

2、程序與執行緒

程序-Process

  指的是程式的一次執行的過程,是一個動態概念,也是程式在執行過程中分配和管理資源的基本單位。

執行緒

  是 CPU 排程和分派的基本單位,它可與同屬一個程序的其他的執行緒共用程序所擁有的全部資源。每個程序都會有一個主執行緒(Main Thread)。

程序、執行緒、邏輯處理器之間的關係

  執行緒是程序的一部分,一個執行緒只能屬於一個程序,而一個程序有一個到多個執行緒。

  程序和執行緒的根本區別:程序是作業系統資源分配的基本單位,而執行緒是任務排程和執行的基本單位。

  邏輯處理器的個數,代表計算機同時能有同樣個數的執行緒在工作。

3、硬體執行緒和軟體執行緒

硬體執行緒也叫邏輯處理器或邏輯核心,同樣的,一個物理核心就可以包含多個硬體執行緒。

軟體執行緒(Software Thread)就是我們常提到的執行緒。

Windows 將每一個硬體執行緒識別為一個可排程的邏輯處理器,每一個邏輯處理器可以執行軟體執行緒程式碼,執行多個軟體執行緒的程序可以充分發揮硬體執行緒和物理核心的優勢,並行地執行指令。

Windows 會給每一個可用的硬體執行緒分配一塊塊的處理時間,並通過這種方式執行上百個千個軟體執行緒。

4、並行與並行

並行:關鍵是你處理多個任務的能力一定要同時

並行:關鍵是你有同時處理多個任務的能力。

所以區別它們最關鍵的點就是:是否是「同時」。可見,能夠「同時」的並行,效率相對更高。

舉例:假如你吃飯吃到一半,電話來了,然後:

  • 你一直到吃完了以後才去接,這就說明你不支援並行也不支援並行。(按順序一個一個處理)
  • 你停了下來接了電話,接完後繼續吃飯,這說明你支援並行。(都可以做,但當時只能做一件事)
  • 你一邊打電話一邊吃飯,這說明你支援並行。(可以同時做多件事)

5、單執行緒與多執行緒

單執行緒

  就是一個程序只有一個執行緒。程式執行時,所走的程式路徑按照連續順序排下來,前面的必須處理好,後面的才會執行。

多執行緒

  就是一個程序有多個執行緒。在程式執行時,所有執行緒會交替執行。後面的執行緒不用等待前面的執行緒處理完畢。

多執行緒根據並行和並行又有不同的情況。

  • 在並行時,多個執行緒會搶佔cpu資源執行一塊邏輯,沒有搶到cpu資源的就會進入等待狀態,等cpu空閒後繼續搶佔資源。這就像一個車間只有一臺機器,所有的工人都有相同的任務,他們都要使用這臺機器,搶到的工人就執行任務,沒有搶到的工人就等待任務執行完畢後,繼續搶這臺機器。
  • 在並行時,多個執行緒會同時執行一塊程式碼邏輯。就像一個車間有四臺機器,四個工人分別使用四臺機器,同時執行任務,不用等待其它工人任務執行完畢。

使用場景的區別:

  • 單執行緒:當有三件事要處理,乙 需要在 甲 之後處理,同時 丙 需要在 乙 之後,這種事件有特定的先後順序(甲-->乙-->丙)。
  • 多執行緒:需處理的多件事互相獨立。例如下載大檔案時的進度條和實際下載進度,就需要一邊顯示進度一邊進行下載。

6、上下文切換

CPU 通過時間片輪轉演演算法來回圈執行執行緒任務,每次執行並不是直接將任務完成。這種切換用時很短,從而使各個程式的執行從表面上看是同時進行的。切換時會儲存之前的執行緒任務狀態,當切換到該執行緒任務的時候,會重新載入該執行緒的任務狀態。而這個從儲存到載入的過程稱之為上下文切換。

比如我們拿了兩本書,一本中英文詞典,一本英文書,在讀英文書時發現某個單詞不認識,於是便開啟中英文詞典看單詞的漢譯,但是放下英文書之前,大腦必須記下這本書讀到了多少頁的多少行,等查詢完單詞之後,能夠繼續讀這本書。但這樣的切換是會影響讀書效率的,同樣上下文切換也會影響多執行緒的執行速度。

由於執行緒的狀態儲存和載入都是耗時的,所以在執行序列化程式碼時,多執行緒相比單執行緒效率低。

7、非同步、同步、響應、函數語言程式設計

非同步程式設計

  是並行的一種形式,老式的非同步程式設計採用回撥的機制,以避免建立不必要的執行緒。非同步程式設計的核心概念是非同步操作,即啟動的操作會在一定時間後才能完成,這個操作正在執行,卻並不會阻塞原來的執行緒,啟動了這個操作的執行緒還可以繼續執行其他任務,等操作完成時,它會呼叫回撥函數,已讓程式知道操作已經結束了。

同步程式設計

  它和單執行緒的效果類似,程序之間的關係不是相互排斥臨界資源的關係,而是相互依賴的關係。即前一個程序的輸出作為後一個程序的輸入,當第一個程序沒有輸出時第二個程序必須等待。具有同步關係的一組並行程序相互傳送的資訊稱為訊息或事件。其中並行又有偽並行和真並行,偽並行是指單核處理器的並行,真並行是指多核處理器的並行。

響應程式設計

  是另一種形式的並行程式設計,它基於非同步事件,而不是非同步程式設計中的非同步操作,非同步操作有一個開始執行的概念,但是非同步事件可以在任何時間發生,並且可以發生多次,大概類似於使用者響應事件的概念。它是一種宣告式的程式設計模式,程式在該模式中對事件做出與之對應的響應。

函數語言程式設計

  大多數並行程式設計,其本質都是函數式的,函數語言程式設計有兩個原則,一個是簡潔,有非常清晰的輸入和輸出,而且儘可能的避免全域性或者共用變數。另一個原則就是不變性,指一段資料不能被修改,程式永遠不需要對這些資料進行同步,就是非常簡單的輸入資料,輸出資料。

部分參考:並行程式設計相關概念  C#並行程式設計相關名詞解釋  單執行緒和多執行緒?  非同步,多執行緒和並行的區別? 並行與並行的區別是什麼? 

注:個人整理,難免有疏漏,請大方的指正或補充,博主也會第一時間進行修改或補充。後續如果博主發現有需要補充的也會持續更新。