多核的CPU可以運行一個進程下的多個線程嗎?

Gingai-K


如果想弄清楚多核CPU如何運行,以及線程與進程的概念,需要回顧一下計算機軟硬件的知識。我們從早期單核CPU開始。

早期單核CPU架構

早期的電路設計能力不支持一個CPU有多核,比較經典的架構如上圖所示。

一個單核CPU的架構包括:

  • Control Unit(CU)起協調管理功能。
  • Arithmetic Logic Unit(ALU)接受控制單元的命令,負責進行加減乘與或非運算。所有數據都存放在寄存器(Register)裡。
  • 寄存器以極高的速度與CU和ALU交互,通常小於1納秒。從寄存器的名字可以看出來,裡面的數據是臨時寄存的,這些數據和指令會被ALU和CU拿來立即進行計算。如果寄存器沒有CPU想要的數據,CPU會去內存或硬盤中讀取。
  • CPU通過Bus(總線)讀取內存或其他設備的數據。計算機中有多條總線。

我們以一個加法運算來解釋上面這些概念。對於一個2 + 2的加法,人類可以直接說出答案,但是換成13234 + 87912,就不得不拿出紙和筆來算一下了。計算機對這兩次計算速度沒有差別,其本質為半導體電路對兩個數字執行加法操作。但與人類不同的是,計算機需要知道兩個問題:

  1. 本次所執行的是哪個指令。
  2. 該指令的執行對象是什麼。

因此,控制單元先取指令 Fetch,然後指令譯碼 Decode解析出要執行什麼指令,並確認指令是對哪些數據(操作數 operand)進行操作,並將操作數從主存加載到寄存器中。ALU執行指令 Execute後結果寫回 Store。

多核

當單個CPU主頻超過一定範圍後,CPU成本和散熱成了很大的問題,主頻很難突破10GHz。為了獲得更快的計算速度和更好的性能,芯片設計者決定繞過主頻,採用人海戰術,在一塊CPU中增加多個核心(Core)。

一個核心是一個可以運行指令的獨立單元,它包含了前面所提到的ALU和寄存器,並配備L1和L2 Cache。多個核心共享L3 Cache。

上圖中是一個多核處理器的電路圖,每個Core旁邊的黑色圓圈分別為L1和L2 Cache。可以看到CPU中,各類Cache佔用了很大的空間。

個人電腦上的CPU一般是單個Processor,每個Processor有多個Core。服務器上的CPU是多個Processor,每個Processor有多個Core,提供更多計算核心。支持單個CPU的服務器被稱為單路服務器,支持兩個CPU的服務器被稱為雙路服務器,支持四個CPU的服務器被稱為四路服務器。上圖展示了Intel的四路架構,系統支持四個CPU,假如每塊CPU內有8個核心,系統可對外提供32核計算能力。

存儲金字塔

要了解計算機的運行原理,除了CPU,我們還要聊聊內存。隨著技術的發展,計算機的速度瓶頸已經變成了超高速的CPU運算速度與落後的數據讀取速度之間的矛盾。CPU計算速度在納秒級別,但是CPU讀取主存的速度竟有百納秒,CPU進行完計算後,要閒置幾十倍的時間,實在是巨大的浪費。從計算本身來說,某個程序一般不需要把硬盤或主存中的所有數據都拿來進行計算,絕大多數時間只需要處理部分熱點數據,因此,把熱點數據加載到緩存中能解決絕大多數問題。綜合計算速度、技術水平、生產成本,設計人員給CPU增加了很多中間的緩存Cache。

CPU的寄存器存取速度極快,但是造價成本太高,發熱量大,不能被大量採用。通常,CPU的寄存器只有幾KB。L1 Cache和L2 Cache一般設計在CPU上,訪問延遲在幾納秒只幾十納秒內,主存的訪問延遲在百納秒內。速度越快,意味著成本越高。所以硬件設計是在現有技術水平、期望計算速度、成本、散熱等因素之間所做的trade-off。

線程與進程

前面都是計算機硬件知識,而線程和進程則是操作系統控制這些硬件而創造的軟件概念。

進程(Process)具有單獨的計算資源,如內存空間。

線程(Thread)是進程的一個子集,一個進程默認啟動一個線程,也可以通過多線程編程,啟動多個線程,多個線程共享共享進程的資源。

在多核架構出現之前,CPU在某個特定時刻只能執行某個程序,無法並行。就像人在某個時刻只能做一件事情,不可能“吃著火鍋還唱著歌”,因為兩項活動都佔著嘴呢嘛。如果要幹另一件事,就必須把其中一件事停下來。

但是前面提到,CPU計算速度是納秒級別,內存讀寫卻是百納秒,那麼為了充分利用CPU,可以把多項任務的數據都放在緩存裡。CPU先“吃會火鍋”,再“唱會歌”,邊吃邊唱,以這種形式實現多線程。單個CPU每次切換不同的線程任務,會產生一些資源開銷。吃飯和唱歌之間,總要讓人稍微歇歇嘛!

以網頁瀏覽器為例,瀏覽器打開一個網頁時通常需要下載網頁中素材,同時也要把數據渲染成畫面。在單核場景下,時間被切成了不同的片段,某段時間只能用來做渲染、緩存或下載中的一項任務。每個任務都有優先級,CPU優先執行高優先級的任務。比如,瀏覽器打開一個新網頁時,要第一時間把網頁展示出來,背景音樂下載比較慢,可以等網站渲染好後再下載,所以有時候背景音樂會比網頁晚半分鐘甚至更長。

多核架構提供給用戶多個可以獨立計算的核心,這也意味著計算機可以同時並行執行多項任務,即並行計算。那麼一個網頁瀏覽器使用一個核渲染網頁,另一個核緩存其他素材,第三個核下載背景音樂。

上圖是我的macOS性能監控的一個軟件(htop),Windows上類似的軟件是任務管理器。圖片綠色橫條上方展示了當前8個CPU核的利用率內存利用率,綠色橫條下方是我啟動的多個進程,其中標藍色的是我的Chrome瀏覽器的進程,我還啟動了Photoshop等軟件。

多核CPU可以運行一個進程裡的多個線程嗎?當然可以,這需要編程時使用多線程技術。


皮皮魯的AI星球


目前大多數操作系統不能,通俗的解釋很容易,遊戲界有句名言,一核打價多核圍觀。比如amd因為核心比Intel多所以多核性能強,Intel單核性能強。但是玩遊戲雙核心i3能秒8核心的推土機。就因為一個進程只能跑在一個核。傳統遊戲就一個進程,新的遊戲會拆分成多個進程,絕大多數遊戲目前是2個。幾乎沒2個以上的。


愛米先生


完全可以,linux下設置線程的CPU affinity(親和性)就行。


帶盾機槍兵


多核心處理器相當於多處理器。目前只有服務器操作系統上的很多程序和桌面版操作系統上少量的應用程序(如PS)支持多核心或多處理器並行計算,也就是多進程。

超線程處理器才是解決單進程多線程應用程序計算效率的技術。但是處理器效率又受到自身頻率、緩存、內存以及io性能影響。所以同樣外部情況下,單核心超線程處理器在目前的大多數應用環境下,比雙核心處理器性能好。

多核心和多處理器不能解決多線程問題。而且多線程其實還是順序執行,只是利用了指令運行之間由io或其他因素造成的時間空隙,去處理其他線程的處理請求。這兩者的理論是不一樣的。


分享到:


相關文章: