CPU核數跟多執行緒的關係
一直以來有這樣的疑惑,單核CPU適合多執行緒嗎?是不是幾個核的CPU開幾個執行緒是最合適的?
今天就這一問題查了一些資料,現整理如下:
要說多執行緒就離不開程序,程序和執行緒的區別在這裡就不詳細說了,只將關鍵的幾點:
a)程序之間是相互獨立的,不共享記憶體和資料,執行緒之間的記憶體和資料是公用的,每個執行緒只有自己的一組CPU指令、暫存器和堆疊,對於執行緒來說只有CPU裡的東西是自己獨享的,程式中的其他東西都是跟同一個程序裡的其他執行緒共享的。
b)作業系統建立程序時要分配好多外部資源,所以開銷大。(這個跟作業系統有關,有人做過實驗,window建立程序的開銷大,linux建立程序的開銷就很小。)
再來說一下CPU,在過去單CPU時代,單任務在一個時間點只能執行單一程式。之後發展到多工階段,計算機能在同一時間點並行執行多工或多程序。雖然並不是真正意義上的“同一時間點”,而是多個任務或程序共享一個CPU,並交由作業系統來完成多工間對CPU的執行切換,以使得每個任務都有機會獲得一定的時間片執行。而現在多核CPU的情況下,同一時間點可以執行多個任務,具體到這個任務在CPU哪個核上執行,這個就跟作業系統和CPU本身的設計相關了。
我們假設一個極端的情況:在一臺單核計算機上只執行2個程式,一個是我們的程式A,另一個是作業系統的程式B,每個程式是一個程序。單核CPU的時候,A和B在CPU上交替執行,具體的分配方式由作業系統來判斷,我這裡猜測應該跟A和B的執行緒數有關,因為執行緒是CPU級別的,如果A有5個執行緒,B也有5個執行緒,那麼CPU分配給A和B的時間應該是1:1的;如果A增加到15個執行緒,CPU分配給A和B的時間應該是3:1的比例。所以此時如果A的執行緒數多,那麼獲得的CPU執行次數就多,處理的速度也就快了。以上假設的前提是:①A和B的優先順序相同,②A和B都是隻消耗CPU資源的程式。
如果相同的情況用一個雙核的計算機來處理又會是什麼結果呢?假設這個雙核的計算機和作業系統比較傻,把A程序分配到核1上,B程序分配到核2上,那不管A有幾個執行緒,都是用核1來處理,那麼時間肯定是一樣的。不過現實中應該不會有這麼傻的CPU和作業系統吧。 所以趕緊還是會根據執行緒來進行處理,當A的執行緒比B多時,會佔用核2來處理A的執行緒。
剛才說的是隻消耗CPU資源的程式,但這樣的程式在實際應用中基本上是沒有的,總會有跟資源打交道的。比如讀個檔案,查個數據庫,訪問一個網路連線等等。這個時候多執行緒才真正體現出優勢,在一個程序中,執行緒a去讀檔案,執行緒b去查資料庫,執行緒c去訪問網路,a先用一下CPU,然後去讀檔案,此時CPU空閒,b就用一下,然後去查資料庫,……,相對於讀檔案、查資料庫、訪問網路來說CPU計算的時間幾乎可以忽略不計,所以多執行緒實際上是計算機多種資源的並行運用,跟CPU有幾個核心是沒什麼關係的。
--------------------- 本文來自 極客on之路 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u014756827/article/details/52396990?utm_source=copy