並行計算

a worldwide shortage of people experienced in parallel computing
全世界程序員最大短處就是缺少並行計算經驗

當CPU進入雙核多核,軟件架構進入分佈式計算 雲計算時代後,他們的共同點並行計算已經成爲一個新的熱點。

前段時間Ruby On Rails JRuby Grails等新式語言有些熱門,可是並行計算倒是它們的殺手,新的並行計算DSL(Domain-specific language)語言 Scala Clojure 以及Erlang在這幾個月已經成爲新的明星。

Scala是一個兼容JVM的並行語言,後臺有IBM等大公司支持,而Erlang是最先由愛立信推出的一個開源語言,目前尷尬是缺少象IBM這樣軟件巨頭支持。2009將有各類有關Clojure語言的介紹。

在這樣的背景下,有人就提出:Java是否已經發展到頂了,可能走下坡路了呢?(Dead like COBOL )

最近Yahoo網格雲計算小組發佈一項驚人性能測試結果:

Java開源Apache Hadoop贏得了TB級別的最快基準測試
,Hadoop能夠在209秒內完成1 TB數據排序,打破了前期297秒的年度記錄(Daytona),成爲最快紀錄冠軍,這是一項1998由Jim Gray建立的基準測試,指定輸入數據( 100億個100字節的記錄) ,完全地排序,並寫入磁盤。

Java取得這項測試的勝利,並非由於Java語言走上了並行語言,而是Java從誕生那天起,就是爲網絡而生,它是經過多臺服務器並行計算取得了這項驕人的成績,仍是那句話:Java在個體上可能拼不過你,可是集成羣了就能打敗你,就象螞蟻個體雖小,可是大量成批螞蟻也是任何生物的殺手。

Java語言由於其高瞻遠矚的前瞻性取得了生命延續,可是這並意味着其停滯不前,現在單臺服務器進入CPU時代,如何在單臺PC的微結構中象Scala那樣提升多核併發計算性能,將是Java 7推出的新特色。

可是,這並不像之前推出的一些新功能特色,並行計算須要程序員思惟方式的改變。其實,從jdon.com討論來看:程序員至關缺少並行開發思惟,從以往不習慣線程併發 到面對EJB這樣分佈式組件開發的抓狂,都說明一些人的思惟升級換代已經跟不上CPU了(最後機器人會打敗一部分人 悲哀)。

Java線程模型提供了開發者很方便的併發開發,並發展到javaEE的Web,使用Jsp/Serlvet封裝多線程,避免通常軟件開發者涉及過於複雜的線程編程,當咱們開發一個Web應用時,部署到Tomcat/Jetty/JBoss服務器上,若是某個時刻有多個用戶同時對這個Web應用發出請求,那麼服務器將分派多個線程分別接受處理這些併發請求。這實際上已是一個多用戶併發系統,可是CPU處理併發請求任務時,因爲是一個CPU,所以實際上內核是順序執行的,如今兩個CPU多核機器已經開始廣泛,如何發揮多核CPU的並行計算模式呢?

這就要對以往計算模式進行顛覆性的修改,並行計算(parallel computation)這個概念的意思應該這樣定義:在單臺PC機中能夠跨多核CPU運行,部署到多臺PC機中,可以跨越多臺服務器雲計算。這樣的伸縮性很是相似無所不能的孫悟空了,這樣的並行計算模式纔是真正可伸縮的Scalable! 

而目前惟有Java最有但願作到這點,Java只要補上微結構多核並行運行這一課,而Scala Clojure 以及Erlang要補集羣雲計算這一課,這也是Scala很是靠近Java一個緣由。

偉大並行計算專家Doug Lea的 Java fork/join framework爲java這趟補課提供了及時雨,下面這段代碼展現java並行計算方式:


import jsr166y.forkjoin.*;

class Fib extends RecursiveTask<Integer> {
static final int threshold = 10;
volatile int number;
Fib(int n) { number = n; }
public Integer compute () {
int n = number;
if (n <= threshold)
return sequentialFib(n);
else {
Fib f1 = new Fib(n - 1);
f1.fork();
Fib f2 = new Fib(n - 2);
return f2.forkJoin() + f1.join();
}
}
public static void main(String[] args) {
try {
int groupSize = 2; // number of CPUs
ForkJoinPool group =
new ForkJoinPool(groupSize);
Fib f = new Fib(40);
Integer result =group.invoke(f);
System.out.println(「Fibonacci Number: 「 + result);
}
catch (Exception ex) {}
}
int sequentialFib(int n) {
if (n <= 1) return n;
else return sequentialFib(n-1) + sequentialFib(n-2);
}
}


fork/join framework將被整合進入JDK 7版本。

固然,新的語言有更方便簡潔的實現,Scala 或 Clojure也許成爲替代ROR/Groovy的明日之星,
或者這兩個語言有各自的細分市場。在將來某個時刻,也許應該死亡的是PHP/ROR。多核時代開啓了軟件編程新時代,咱們面臨更多挑戰和創新,好的工具和平臺能夠幫助咱們更好地進入新時代。

相關文章
相關標籤/搜索