[仁潤雲技術團隊]併發程式設計-(2)併發程式設計的目標

仁潤雲發表於2018-10-30

並行程式設計的目標

並行程式設計有如下3個主要目標:

  1. 效能。
  2. 生產率。
  3. 通用性。

效能

大多數並行程式設計上的工作都是為了提高效能,如果不考慮效能因素的話單執行緒程式碼顯然是更加輕鬆的方案。這裡的效能包括可擴充套件性(例如每CPU效能)及效率(例如每瓦特效能)。

另外一個讓並行軟體大行其道的原因是摩爾定律在提高單執行緒效能方面不再有效。這意味著我們不能夠再依賴於硬體效能的提升來達到我們預期。

但是要注意一點,並行化只是眾多優化措施中的一種,而且併發並不是沒有代價(上下文切換消耗資源,維護併發程式的困難性)。所以通常我們對一特定問題採用併發演算法之前要與最好的序列演算法相比較。

生產率

首先我們要確認這不是一個技術性問題。 生產率為何在這個時代顯得如此重要。試想早年一臺計算機價值百萬美元,而工程師的年薪對比來說卻是不值一提。假如一個10人工程師團隊將該機器速度優化10%,那也是非常划算的一筆生意。 而在今天硬體價格走低,高效地使用硬體不再像以前那樣有吸引力(仍然有其價值),高效地利用開發者已經變得同樣重要。所以在我們研發時需要考慮到併發程式本身將降低生產率這一事實。

通用性

讓我們的程式儘可能的通用,這樣可以攤薄開發軟體的成本。但是問題在於通用性代表著更大的效能損耗以及生產率低下。(開發一個更加通用的程式通常要花費專用程式數倍的時間)

例如,Java擁有與生具來的多執行緒能力但是我們通常認為它的效能是低於C/C++的(儘管Java正在變得越來越快)。SQL擁有極好的效能,但是它僅僅用於資料庫查詢。

目前而言,兼具效能、生產率、通用性的程式並不存在,我們仍然需要在其中做平衡。越接近於地層的系統越需要通用性及效能。下面是一個簡單的層次劃分:

  • 應用程式
  • 中介軟體
  • 系統庫
  • 作業系統核心
  • 韌體
  • 硬體

我們要理解的是,並行程式設計不是目標。效能,生產率,通用性才是。

並行程式設計的替代方案

  1. 多個序列例項。
  2. 利用現有的並行軟體構建應用。
  3. 對序列應用進行邏輯優化。

這裡主要分析第二點,利用現有的並行軟體構建應用。 Web伺服器,關係型資料庫是這方面的典型應用。例如一種常見的設計就是並行軟體為使用者(廣義上的)提供一個單獨的處理程式,然後在並行軟體上並行執行(關係型資料庫就是這樣一種設計)。應用程式(Application)只需要負責使用者介面,而關係型資料庫處理併發及永續性問題。這樣雖然會犧牲一點效能,但是可以顯著降低開發難度。

本章主要分析併發程式設計的目標,後面將通過Java併發程式設計中的一些特性深入瞭解並行程式設計以及其應用。

歡迎關注:www.renrunyun.com

相關文章