本博客系列是學習並發編程過程中的記錄總結。由於文章比較多,寫的時間也比較散,所以我整理了個目錄貼(傳送門),方便查閱。
並發和並行
在真正開始聊本文的主題之前,我們先來回顧下兩個老生常談的概念:並發和並行。
- 並發:是指多個線程任務在同一個CPU上快速地輪換執行,由於切換的速度非常快,給人的感覺就是這些線程任務是在同時進行的,但其實並發只是一種邏輯上的同時進行;
- 並行:是指多個線程任務在不同CPU上同時進行,是真正意義上的同時執行。
下面貼上一張圖來解釋下這兩個概念:
上圖中的咖啡就可以看成是CPU,上面的只有一個咖啡機,相當於只有一個CPU。想喝咖啡的人只有等前面的人制作完咖啡才能制作自己的開發,也就是同一時間只能有一個人在制作咖啡,這是一種並發模式。下面的圖中有兩個咖啡機,相當於有兩個CPU,同一時刻可以有兩個人同時制作咖啡,是一種並行模式。
我們發現並行編程中,很重要的一個特點是系統具有多核CPU。要是系統是單核的,也就談不上什么並行編程了。那么是什么原因導致了現代CPU架構都是多核架構?如果CPU架構都是單核的架構我們是不是就能不要研究什么並行編程了?
"摩爾定律"失效
上面章節中留下了一個問題:為什么現代CPU都是多核架構。為了回答這個問題,我們先來了解一個定律--摩爾定律。
1965年,英特爾聯合創始人戈登·摩爾提出以自己名字命名的「摩爾定律」,意指集成電路上可容納的元器件的數量每隔 18 至 24 個月就會增加一倍,性能也將提升一倍。
根據摩爾定律,CPU的性能每隔18到24個月就能增長一倍。但是從現在的情況來看,單核CPU的主頻已經逼近了極限,以現在的制造工藝,很難再繼續提升單核CPU的主頻。也就是說摩爾定律已經失效。
雖然摩爾定律失效了,但是科技的進度對CPU性能的需求沒有停止。這個也難不倒我們偉大的硬件工程師。一個CPU的性能提升有限,我將兩個CPU拼在一起性能不就提升一倍了么。於是多核CPU的架構就出現了。
提高CPU工作主頻主要受到生產工藝的限制。由於CPU是在半導體硅片上制造的,在硅片上的元件之間需要導線進行聯接,由於在高頻狀態下要求導線越細越短越好,這樣才能減小導線分布電容等雜散干擾以保證CPU運算正確。因此制造工藝的限制,是CPU主頻發展的最大障礙之一。
多核架構引發並行編程
為了繼續保持性能的高速發展,硬件工程師破天荒地想出了將多個CPU內核塞進一個CPU里的奇妙想法。由此,並行計算就被非常自然地推廣開來,隨之而來的問題也層出不窮,程序員的黑暗時期也隨之到來。簡化的硬件設計方案必然帶來軟件設計的復雜性。換句話說,軟件工程師正在為硬件工程師無法完成的工作負責,他們將摩爾定律失效的責任推給了軟件開發者。
所以,如何讓多個CPU有效並且正確地工作也就成了一門技術,甚至是很大的學問。比如,多線程間如何保證線程安全,如何正確理解線程間的無序性、可見性,如何盡可能地設計並行程序,如何將串行程序改造為並行程序。而對並行計算的研究,也就是希望給這片黑暗帶來光明。
總結
世界就是這樣一個矛盾體,並發編程能讓我們充分地利用CPU資源,提升系統性能。但是同時也給我們帶來了很多問題,比如線程上下文切換對性能消耗的問題、共享變量的線程安全問題、線程死鎖問題和線程間通信等問題。研究並行編程就是研究怎么在享受多線程編程給我們帶來便利的同時又能規避多線程帶來的坑。作為一個Java后端開發程序員,我們更應該掌握好多線程編程,因為服務器端對性能的追求是非常高的。