作業系統與多核處理器

神棍先生發表於2017-11-10
這篇文章解答了我心中的疑問,那就是作業系統會自動排程cpu資源來處理多程式,多執行緒的併發。
 
     早在上世紀90年代末,就有眾多業界人士呼籲用CMP(單晶片多處理器)技術來替代複雜性較高的單執行緒CPU。IBM、惠普、Sun等高階伺服器廠商,更是相繼推出了多核伺服器CPU。不過,由於伺服器價格高、應用面窄,並未引起大眾廣泛的注意。直到AMD搶先手推出64位處理器後,英特爾才想起利用“多核”這一武器進行“帝國反擊戰”。2005年4月,英特爾倉促推出簡單封裝雙核的奔騰D和奔騰四至尊版840。AMD在之後也釋出了雙核皓龍(Opteron)和速龍(Athlon)
64 X2和處理器。但真正的“雙核元年”,則被認為是2006年。這一年的7月23日,英特爾基於酷睿(Core)架構的處理器正式釋出。
    

    雙核的優勢不是頻率,而是對付同時處理多件事情。一個核心理論上同時只能幹一件事,比如你同時在後臺BT下載,前臺一邊看電影一邊拷貝檔案一邊聯QQ……,這麼多程式同時需要CPU來響應,怎麼辦?靠作業系統! 
    window本身就是多執行緒作業系統(DOS就是單執行緒系統,dos下2核4核和單核沒區別,處理一個任務時必須停下來等待處理結束才能幹下一件事),它可以把每個處理任務劃分為多“份”(一個任務可以由多個程式來實現,把每個程式又分為多個執行緒,然後由作業系統協調分配多核來處理排隊的執行緒,最後把處理結果合併),多個處理任務按順序排成佇列,這樣單核心的CPU可以一次處理一“份”,輪流處理每個程式的“份”,這樣你感覺就是CPU同時在幹幾件事了。但如果CPU不夠強勁,同時排隊等待處理的東西太多了,你就會感覺系統在等待,有延時,反應慢等等症狀。再或者某個程式出現錯誤,當機了,很可能造成後面排隊的其他任務都在那裡乾等,造成系統無反應的情況,按熱啟鍵都沒反應。理論上如果現在有顆6G頻率的單核CPU,單論處理效能應該與1個3G雙核近似,甚至更高一些,因為目前雙核比單核也就快不到2倍。

   原本計算機一直以單核心的工作頻率作為效能的衡量,之所以放棄單核是因為目前的技術水平令單核效能繼續提升遇到了瓶頸,4G P4的夭折讓依靠頻率提升效能的路子走進死衚衕,不得已改走多核心路線,以核心數量來彌補處理能力的不足。不過慢慢的這些多核心的頻率又開始奔3G去了,隨著45nm的出現,雙核上4G應該可以想象,所以一方面每個核心的效能還在發展,另一方面多核心整合的手段雙管齊下,這樣CPU的效能可以迅速提升,繼續保持摩爾定律。 
    多核CPU就是基板上整合有多個單核CPU,早期PD雙核需要北橋來控制分配任務,核心之間存在搶二級快取的情況,後期酷睿自己整合了任務分配系統(硬體上),再搭配作業系統(軟體上)就能真正同時開工,2個核心同時處理2“份”任務,速度快了,萬一1個核心當機,起碼另一個U還可以繼續處理關機、關閉軟體等任務。較早的作業系統如XP等需要裝雙核或多核補丁,能更好發揮效能或更穩定,Vistia下就不需要。 
    目前幾乎所有的程式在編寫時是按單核心CPU寫的(多核心程式優化對程式設計師來說是個噩夢,目前好像還沒有合適的程式設計軟體能讓程式設計師輕鬆編寫針對多核心的程式),因此對多核的利用率不是很高,分配任務時,往往1個核心滿負荷,另一個還有空閒(留些空閒也對,要應付隨時發生的其它命令)。一般2核心效能也就比單核心高60~70%甚至更低。 
    4核或者將來的8核說白了還是多個核心獨自處理各自的“份”,不過人多力量大,速度快,響應時間短,不易當機。當然耗電、協調性都會是個考驗。 

補充: 
    原本有個說法(有陣子我自己就持這觀點):“目前的軟體都是為單核心編寫的,多核CPU處理起來也沒什麼優勢。” 
    經過分析我們可以得知,參與任務分配的主角一是程式自己,二是作業系統,即使如單任務的SuperPI,在雙核下成績也要比同頻率的單核快不少,這就是事實證明。理論分析:單執行緒程式很傻,不知道有2個CPU在前面等著,所以發出的請求應該也是針對單核心的,但作業系統自動將呼叫請求分配給了2個CPU,並在處理結束後將結果合併,所以單核心程式也能享受到多核的“照顧”。儘管作業系統分配的可能不完美,但畢竟比單CPU要快。 
    如果程式自己又對多執行緒處理進行了優化(重新編寫),那麼就更完美了,可以達到2倍水平,對於這點5樓的朋友已經能舉出具體的例子了。非常感謝。 
    再推測一下,根據上面的分析,2G雙核應該比2G單核快近2倍,那麼2G的4核應該比2G的雙核快近2倍!如果有4G的雙核,那麼應該和2G的4核效能近似。

       對於多核CPU,優化作業系統任務排程演算法是保證效率的關鍵。一般任務排程演算法有全域性佇列排程和區域性佇列排程。前者是指作業系統維護一個全域性的任務等待佇列,當系統中有一個CPU核心空閒時,作業系統就從全域性任務等待佇列中選取就緒任務開始在此核心上執行。這種方法的優點是CPU核心利用率較高。後者是指作業系統為每個CPU核心維護一個區域性的任務等待佇列,當系統中有一個CPU核心空閒時,便從該核心的任務等待佇列中選取恰當的任務執行,這種方法的優點是任務基本上無需在多個CPU核心間切換,有利於提高CPU核心區域性Cache命中率。目前多數多核CPU作業系統採用的是基於全域性佇列的任務排程演算法


相關部落格:移動CPU非同步多核和大小核的那些事 http://www.leiphone.com/1208-vv-cpu.html 



相關文章