多程序和多執行緒的優缺點
在Linux下程式設計多用多程序程式設計少用多執行緒程式設計。
IBM有個傢伙做了個測試,發現切換執行緒context的時候,windows比linux快一倍多。進出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當然這並不是說linux不好,而且在經過實際程式設計之後,綜合來看我覺得linux更適合做high performance server,不過在多執行緒這個具體的領域內,linux還是稍遜windows一點。這應該是情有可原的,畢竟unix家族都是從多程序過來的,而 windows從頭就是多執行緒的。
如果是UNIX/linux環境,採用多執行緒沒必要。
多執行緒比多程序效能高?誤導!
應該說,多執行緒比多程序成本低,但效能更低。
在UNIX環境,多程序排程開銷比多執行緒排程開銷,沒有顯著區別,就是說,UNIX程序排程效率是很高的。記憶體消耗方面,二者只差全域性資料區,現在記憶體都很便宜,伺服器記憶體動輒若干G,根本不是問題。
多程序是立體交通系統,雖然造價高,上坡下坡多耗點油,但是不堵車。
多執行緒是平面交通系統,造價低,但紅綠燈太多,老堵車。
我們現在都開跑車,油(主頻)有的是,不怕上坡下坡,就怕堵車。
高效能交易伺服器中介軟體,如TUXEDO,都是主張多程序的。實際測試表明,TUXEDO效能和併發效率是非常高的。TUXEDO是貝爾實驗室的,與UNIX同宗,應該是對UNIX理解最為深刻的,他們的意見應該具有很大的參考意義。
====================================================================================================
多執行緒的優點:
無需跨程序邊界; 程式邏輯和控制方式簡單; 所有執行緒可以直接共享記憶體和變數等; 執行緒方式消耗的總資源比程序方式好; 多執行緒缺點:
每個執行緒與主程式共用地址空間,受限於2GB地址空間; 執行緒之間的同步和加鎖控制比較麻煩; 一個執行緒的崩潰可能影響到整個程式的穩定性; 到達一定的執行緒數程度後,即使再增加CPU也無法提高效能,例如Windows Server 2003,大約是1500個左右的執行緒數就快到極限了(執行緒堆疊設定為1M),如果設定執行緒堆疊為2M,還達不到1500個執行緒總數; 執行緒能夠提高的總效能有限,而且執行緒多了之後,執行緒本身的排程也是一個麻煩事兒,需要消耗較多的CPU
多程序優點:
每個程序互相獨立,不影響主程式的穩定性,子程序崩潰沒關係; 通過增加CPU,就可以容易擴充效能; 可以儘量減少執行緒加鎖/解鎖的影響,極大提高效能,就算是執行緒執行的模組演算法效率低也沒關係; 每個子程序都有2GB地址空間和相關資源,總體能夠達到的效能上限非常大 多執行緒缺點:
邏輯控制複雜,需要和主程式互動; 需要跨程序邊界,如果有大資料量傳送,就不太好,適合小資料量傳送、密集運算 多程序排程開銷比較大; 最好是多程序和多執行緒結合,即根據實際的需要,每個CPU開啟一個子程序,這個子程序開啟多執行緒可以為若干同類型的資料進行處理。當然你也可以利用多執行緒+多CPU+輪詢方式來解決問題……
方法和手段是多樣的,關鍵是自己看起來實現方便有能夠滿足要求,代價也合適。
---------------------------------------------------------
程序的優點:
1)順序程式的特點:具有封閉性和可再現性;
2)程式的併發執行和資源共享。多道程式設計出現後,實現了程式的併發執行和資源共享,提高了系統的效率和系統的資源利用率。 程序的缺點:
作業系統排程切換多個執行緒要比切換排程程序在速度上快的多。而且程序間記憶體無法共享,通訊也比較麻煩。
執行緒之間由於共享程序記憶體空間,所以交換資料非常方便;在建立或撤消程序時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於建立或撤消執行緒時的開銷。
執行緒的優點:
1)它是一種非常"節儉"的多工操作方式。在Linux系統下,啟動一個新的程序必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段,這是一種"昂貴"的多工工作方式。而運行於一個程序中的多個執行緒,它們彼此之間使用相同的地址空間,共享大部分資料,啟動一個執行緒所花費的空間遠遠小於啟動一個程序所花費的空間,而且,執行緒間彼此切換所需的時間也遠遠小於程序間切換所需要的時間。當然,在具體的系統上,這個資料可能會有較大的區別;
2)執行緒間方便的通訊機制,由於同一程序下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便;
3)使多CPU系統更加有效。作業系統會保證當執行緒數不大於CPU數目時,不同的執行緒運行於不同的CPU上;
4)改善程式結構。一個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改。 執行緒的缺點: 1.排程時, 要儲存執行緒狀態,頻繁排程, 需要佔用大量的機時; 2.程式設計上容易出錯(執行緒同步問題)。