單核CPU vs. 多核CPU

單核CPU vs. 多核CPU

單核CPU

起源:

CPU的起源是1971年英特爾公司推出,由此正式宣告計算機的誕生,可以說是世界級的改變,並且嚴格準守馮諾依曼體系結構,在英特爾推出CPU之前的計算機所使用的處理器工作是非常麻煩的,需要複雜的線路組合才能使其正常工作,當然英特爾推出的CPU也是需要線路組合,但是相比之前的線路英特爾的要較爲簡潔,並且英特爾將這些線路組合稱爲總線!

工作原理:

單核CPU較爲死腦,在通電時該CPU就會執行存儲塊中的指定地址的指令,如果你想要執行內存塊其他地方的代碼必須調整總線位置纔可以讓其執行!

單核CPU就相當於阻塞程序,在工作期間只能執行某一個程序!

單核(超時間軸)CPU

顯而易見,單核CPU並不是長久的,所以英特爾推出了時間軸的工作方式,一個CPU幹上兩個或兩個以上的CPU的活。因爲CPU的工作速度取決於晶體管,晶體管越多,CPU每秒工作率就越大,英特爾就想了一個增加CPU的晶體管的辦法,讓CPU的工作頻率赫茲增加,然後增加北橋芯片用於和內存通訊,再將地址總線與內存對應起來(以次方的方式),這樣就無需每次執行其他程序前修改一次線路了。

最後需要操作系統的幫忙,當CPU通電時會一直執行某一塊內存的代碼,但是無需手動修改線路了。此外CPU中還有時鐘電路,該電路用於控制CPU多少毫秒跳轉到指定地址,那麼操作系統可以利用時鐘電路讓其CPU跳轉到其他地方,然後再跳轉回來!

PS:晶體管是一種固體半導體器件,具有檢波、整流、放大、開關、穩壓、信號調製等多種功能。晶體管作爲一種可變電流開關,能夠基於輸入電壓控制輸出電流。

多核CPU

多核CPU,即多個CPU組成。這些CPU集成在一個芯片裏,可以通過內部總線來交互數據,共享數據,這些CPU中分配出一個獨立的核執行操作系統,每個核都有自己的寄存器,ALU運算單元等(這些都是封裝在CPU內部的),但是一級二級緩存是共享的,這些CPU通過總線來交互數據,並且工作是並行的,資源分配是由操作系統來完成,操作系統來決定程序CPU的控制權分配,所以一個多核CPU的工作效率大多體現在操作系統的分配上,因爲一個CPU基本上可以執行很多個程序,通過PCB進程控制塊的方式存儲當前代碼段,然後來回跳轉,所以當CPU核過多時,操作系統在分配時可能會導致部分CPU閒置!

多個CPU

即擁有多個CPU的主機,每個CPU只能用來獨立執行不同的程序,這些CPU都是單核的,不用在家用電腦,只用在特定的機器上。因爲單核CPU執行一個程序比來回跳轉執行的速度要快很多,但是難以管理。每個CPU有自己的總線,一級二級緩存,那麼這樣需要更大的佔用面積,更多的總線,因爲這些CPU不是封裝在一個芯片裏的!

單核CPU和多核CPU的區別:

雙核的優勢不是頻率,而是對付同時處理多件事情。單核同時只能幹一件事,比如你同時在後臺BT下載,前臺一邊看電影一邊拷貝文件一邊QQ。這麼多程序同時需要CPU來響應要靠操作系統,Windows本身就是多線程操作系統(DOS就是單線程系統,DOS下雙核和單核沒區別,處理一個任務時必須停下來等待處理結束才能幹下一件事),它可以把每個處理任務劃分爲“多份”,多個處理任務按順序排成隊列,這樣單核的CPU可以一次處理“一份”,輪流處理每個程序的“份”,這樣感覺就是CPU同時在幹幾件事了。但如果CPU不夠強勁,同時排隊等待處理的東西太多了,那就會感覺系統在等待、有延時、反應慢等症狀。再或者某個程序出現錯誤,死機了,造成後面排隊的其他任務都在那裏乾等,造成系統無反應。

雙核CPU就是基板上集成有多個單核CPU,自己集成了任務分配系統,再搭配操作系統就能真正同時開工,兩個核心同時處理“兩份”任務,速度快了,萬一一個核心死機,起碼另一個CPU還可以繼續處理關閉軟件、關機等任務。

所以一方面每個核心的性能還在發展,另一方面多核心集成的手段雙管齊下,這樣CPU的性能可以迅速提升。1G雙核應該比1G單核快近2倍,那麼1G的4核應該比1G的雙核快近2倍!如果有4G的雙核,那麼應該和2G的四核性能近似。


下面是一些道友的見解,記錄於此處,便於以後查閱:

@ 單核CPU上運行的多線程程序, 同一時間只能一個線程在跑, 系統幫你切換線程而已, 系統給每個線程分配時間片來執行, 每個時間片大概10ms左右, 看起來像是同時跑, 但實際上是每個線程跑一點點就換到其它線程繼續跑。

@ 多線程的用處在於,做某個耗時的操作時,需要等待返回結果,這時用多線程可以提高程序併發程度。如果一個不需要任何等待並且順序執行能夠完成的任務,用多線程簡直是浪費。

@ 線程必然不是越多越好,線程切換也是要開銷的,當增加一個線程時,額外開銷要小於該線程能夠消除的阻塞時間,這才叫物有所值。Linux自從2.6內核開始,就會把不同的線程交給不同的核心去處理。Windows也從NT.4.0開始支持這一特性。

@ 什麼時候該使用多線程呢?這要分四種情況討論:

a.多核CPU——計算密集型任務。此時要儘量使用多線程,可以提高任務執行效率,例如加密解密,數據壓縮解壓縮(視頻、音頻、普通數據),否則只能使一個核心滿載,而其他核心閒置。

b.單核CPU——計算密集型任務。此時的任務已經把CPU資源100%消耗了,就沒必要也不可能使用多線程來提高計算效率了;相反,如果要做人機交互,最好還是要用多線程,避免用戶沒法對計算機進行操作。

c.單核CPU——IO密集型任務,使用多線程還是爲了人機交互方便。

d.多核CPU——IO密集型任務,這就更不用說了,跟單核時候原因一樣。

@ CPU的多核和應用程序的多線程的關係

        多核指的是CPU有多個核心,多線程是程序有多個線程在同時執行。

        多核要用多線程才能發揮優勢。同樣,多線程要在多核上才能真正有優勢。

        這點來說,對程序員不是透明的。程序員可以控制程序/線程在哪個CPU(核)上運行。用戶也可以控制程序在哪幾個核上運行。所以,多核、多線程對用戶和程序員都不是透明的。


繼續補充一點關於“進程、線程”的知識

進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,即進程是操作系統進行資源分配的最小單元。進程在運行過程中創建的資源隨着進程的終止而被銷燬,所使用的系統資源在進程終止時被釋放或關閉。

線程是進程內部的一個執行單元。系統創建好進程後,實際上就啓動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啓動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。

每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程併發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較爲廣泛。

多線程可以實現並行處理,避免了某項任務長時間佔用CPU。要說明的一點是,目前大多數的操作系統教材中的單處理器都是指的單核處理器。對於單核單處理器(CPU),爲了運行所有這些線程,操作系統爲每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好像這些線程都在同時運行。由此可見,如果兩個非常活躍的線程爲了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。

最開始,線程只是用於分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那麼每個線程都可分配給一個不同的處理器,真正進入“並行運算”狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器,只需將程序編寫成多線程模式即可。程序在邏輯意義上被分割爲數個線程;假如機器本身安裝了多個處理器,那麼程序會運行得更快,毋需作出任何特殊的調校。

根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一臺打印機。爲解決這個問題,對那些可共享的資源來說(比如打印機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務後,再解開(釋放)這個鎖,使其他線程可以接着使用同樣的資源。

線程是爲了同步完成多項任務,不是爲了提高運行效率,而是爲了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。

最簡單的比喻,多線程就像火車的每一節車廂,而進程則是火車。車廂離開火車是無法跑動的,同理火車也不可能只有一節車廂。多線程的出現就是爲了提高效率。同時它的出現也帶來了一些問題。

注:單核處理器並不是一個長久以來存在的概念,在近年來多核心處理器逐步普及之後,單核心的處理器爲了與雙核和四核對應而提出。顧名思義處理器只有一個邏輯核心。

多核處理器和多處理器的區別

多核是指一個CPU有多個核心處理器,處理器之間通過CPU內部總線進行通訊。而多CPU是指簡單的多個CPU工作在同一個系統上,多個CPU之間的通訊是通過主板上的總線進行的。

從以上原理可知,N個核的CPU,要比N個CPU在一起的工作效率要高(單核性能一致的情況下)。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章