1.1 使用共享內(nèi)存的多核系統(tǒng)
2005年,Herb Sutter在Dr. Dobb’s Journal雜志發(fā)表了一篇名為“The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software”的文章(www.gotw.ca/publications/ concurrency-ddj.htm)。他在這篇文章中討論了開發(fā)軟件時要開始考慮并發(fā)性的必要性,提出只有考慮了并發(fā)性才能充分發(fā)揮微處理器日漸增長的吞吐能力。微處理器廠商不是一味地增加處理器的時鐘頻率,而是在向處理器中添加更多的內(nèi)核。軟件開發(fā)人員再也不能依賴于增加時鐘頻率帶來性能提升的免費午餐了。
當(dāng)今的很多計算機(jī)至少都有一顆雙核的微處理器。然而,帶有四個內(nèi)核和八個內(nèi)核的四核處理器和八核處理器在服務(wù)器、高端工作站甚至在高端移動計算機(jī)上都非常常見。在單個處理器上具有更多內(nèi)核的時代正在來臨。現(xiàn)代微處理器提供了新型的多核架構(gòu)。因此,軟件設(shè)計和編碼能夠準(zhǔn)備好充分發(fā)揮這些架構(gòu)的功能是一件非常重要的事情。Visual C# 2010和.NET Framework 4所生成的各種應(yīng)用程序運行在一個或多個中央處理單元(central processing units,CPU),即主微處理器上。每一個這種微處理器都可能包含不同數(shù)目的內(nèi)核,每一個內(nèi)核都可以執(zhí)行指令。
您可以將多核微處理器想象為在一個單獨的封裝包內(nèi)的很多互相連接的微處理器。所有的內(nèi)核都可以訪問主內(nèi)存,如圖1-1所示。因此,這種架構(gòu)也稱為共享內(nèi)存的多核架構(gòu)(shared-memory multicore)。這種方式的共享內(nèi)存很容易導(dǎo)致性能瓶頸。
多核微處理器有很多種不同的復(fù)雜微架構(gòu),旨在提供更強(qiáng)的并行執(zhí)行能力,提升整體吞吐量,并減少潛在的瓶頸。同時,多核微處理器還在努力縮減電源消耗,并減少發(fā)熱量。因此,很多現(xiàn)代的微處理器可以根據(jù)工作負(fù)載提升或降低每個內(nèi)核的時鐘頻率,甚至可以讓不在使用中的內(nèi)核進(jìn)入睡眠狀態(tài)。Windows 7和Windows Server 2008 R2還支持一項名為內(nèi)核暫停(Core Parking)的新功能。當(dāng)正在使用的內(nèi)核不多的時候就會啟用這項功能,操作系統(tǒng)會使剩下的內(nèi)核進(jìn)入睡眠狀態(tài)。當(dāng)需要使用這些內(nèi)核的時候,操作系統(tǒng)又會喚醒這些睡眠的內(nèi)核。
現(xiàn)代微處理器可以為每個內(nèi)核使用動態(tài)的頻率。由于內(nèi)核不以固定的頻率工作,因此很難預(yù)測指令序列的性能。例如,Intel Turbo Boost Technology能夠提升活動內(nèi)核的頻率。提升一個內(nèi)核頻率的過程也稱為超頻(overclocking)。
如果一個內(nèi)核的工作負(fù)載非常重,那么這項技術(shù)能夠讓這個內(nèi)核以更高的頻率工作,而其他內(nèi)核保持空閑狀態(tài)。如果很多內(nèi)核的工作負(fù)載都非常繁重,那么這些內(nèi)核將都能夠以更高的頻率工作,但是不能達(dá)到單個內(nèi)核工作時那么高的頻率。微處理器不能讓所有的內(nèi)核長時間超頻工作,因為這樣會消耗更多的電力,而且溫度會迅速上升。所有內(nèi)核在重負(fù)載情況下的平均時鐘頻率比單個內(nèi)核能夠達(dá)到的時鐘頻率要低。因此,在某些特定的情況下,有一些代碼能夠在比別的代碼更高的頻率下運行,這樣就使得真實性能的測量變得困難了。