1. 程式人生 > >多核CPU和單核CPU下的多執行緒

多核CPU和單核CPU下的多執行緒

多核CPU和單核CPU下的多執行緒

多執行緒程式設計是現代軟體技術中很重要的一個環節。要弄懂多執行緒,這就要牽涉到多程序?當然,要了解到多程序,就要涉及到作業系統。不過大家也不要緊張,聽我慢慢道來。這其中的環節其實並不複雜。

單核CPU下的多執行緒

在沒有出現多核CPU之前,我們的計算資源是唯一的。如果系統中有多個任務要處理的話,那麼就需要按照某種規則依次排程這些任務進行處理。什麼規則呢?可以是一些簡單的排程方法,比如說:

  1. 按照優先順序排程
  2. 按照FIFO排程
  3. 按照時間片排程等等

當然,除了CPU資源之外,系統中還有一些其他的資源需要共享,比如說記憶體、檔案、埠、socket等。既然前面說到系統中的資源是有限的,那麼獲取這些資源的最小單元體是什麼呢,其實就是程序。

舉個例子來說,在Linux上面每一個享有資源的個體稱為task_struct,實際上和我們說的程序是一樣的。我們可以看看task_struct(linux 0.11程式碼)都包括哪些內容
在這裡插入圖片描述
每一個task都有自己的pid,在系統中資源的分配都是按照pid進行處理的。這也就說明,程序確實是資源分配的主體。

這時候,可能有朋友會問了,既然task_struct是資源分配的主體,那為什麼又出來thread?為什麼系統排程的時候是按照thread排程,而不是按照程序排程呢?原因其實很簡單,程序之間的資料溝通非常麻煩,因為我們之所以把這些程序分開,不正是希望它們之間不要相互影響嘛。

假設是兩個程序之間資料傳輸,那麼需要如果需要對共享資料進行訪問需要哪些步驟呢?

1)建立共享記憶體;

2)訪問共享記憶體->系統呼叫->讀取資料;

3)寫入共享記憶體->系統呼叫->寫入資料
程式碼演示:
在這裡插入圖片描述

上面的程式碼是一個建立子程序的程式碼,我們發現列印的value數值還是10。儘管中間建立了子程序,修改了value的數值,但是我們發現列印下來的數值並沒有發生改變,這就說明了不同的程序之間記憶體上是不共享的。

那麼,如果修改成thread有什麼好處呢?其實最大的好處就是每個thread除了享受單獨cpu排程的機會,還能共享每個程序下的所有資源。要是排程的單位是程序,那麼每個程序只能幹一件事情,但是程序之間是需要相互互動資料的,而程序之間的資料都需要系統呼叫才能應用,這在無形之中就降低了資料的處理效率。

多核CPU下的多執行緒

沒有出現多核之前,我們的CPU實際上是按照某種規則對執行緒依次進行排程的。在某一個特定的時刻,CPU執行的還是某一個特定的執行緒。然而,現在有了多核CPU,一切變得不一樣了,因為在某一時刻很有可能確實是n個任務在n個核上執行。我們可以編寫一個簡單的open mp測試一下,如果還是一個核,執行的時間就應該是一樣的。
在這裡插入圖片描述

多執行緒程式設計

為什麼要多執行緒程式設計呢?這其中的原因很多,我們可以舉例解決。

  1. 有的是為了提高執行的速度,比如多核cpu下的多執行緒;
  2. 有的是為了提高資源的利用率,比如在網路環境下下載資源時,時延常常很高,我們可以通過不同的thread從不同的地方獲取資源,這樣可以提高效率;
  3. 有的為了提供更好的服務,比如說是伺服器;
  4. 其他需要多執行緒程式設計的地方等等。