2 回答

TA貢獻1797條經驗 獲得超4個贊
多進程服務器的一個重要優勢是如果某個處理單元遇到問題崩潰了(比如SIGSEV),那也只是一個進程崩潰了而已,其他提供服務的進程還都在。
但是如果是用線程的話,一個線程掛了,所有的在同一個進程內的線程就都跪了。
不過這只是一個參考因素而已,具體是用線程還是進程,還得看你所要做的服務器的具體的模型,才能真正下定論。

TA貢獻1827條經驗 獲得超4個贊
1、Linux內核其實是用進程來實現線程的,所以在內核某些方面的處理,兩者資源和開銷可能差不多,但其它平臺的實現就不一定了。
2、如果要實現一個web服務器,一個client連接對應一個線程,和一個client連接對應一個進程,兩者有很大的不同,一個系統最多的進程數是有限制的,數量也不會太多,而線程真的可以有很多(我沒研究過)。當然另一個做法可以是開一個進程來處理多個client連接,但是線程間的同步和數據共享,要比在進程間來得容易,而且進程間的通訊開銷還是比較大的(比如socket、共享內存、消息隊列等)。線程間如果鎖使用不當,比如鎖粒度太大,導致性能不理想,但這是設計的問題。
3、用多進程的方法來實現某些需求很合適,比如像google chrome,每一個網頁(標簽)就用一個進程來處理,所以某個標簽崩潰了(網頁有flash經常會崩潰:)),不會導致整個瀏覽器崩潰,這是選擇進程的優點。缺點也是顯而易見的,開一堆網頁后,發現系統有一堆的進程,用戶和系統內核都不會喜歡這樣的:)另外,一個程序有多個進程并發執行任務,每個進程可以在單獨的CPU中運行,這是比較高效的利用了多(核)CPU,因為線程在多個CPU調度的時候,有數據的共享和同步,在處理時可能要等待其它CPU(或有CPU間的數據共享)讓出鎖,這樣就會有開銷,所以某種程度講,選用多進程模型有時是有意利用多CPU(不知這樣說得不得當?)
4、由于對系統來說,一個進程的資源是有限制的,比如文件打開的最大數量、能創建的線程的數量、網絡連接數量等,所以通常對一個服務器程序來說,在一個機器上運行多個實例(多個進程)也是一個提高機器性能使用率的方法。
所以,不能一概而定,線程和進程各有存在的目的和意義,要根據自己程序的需求來選擇。以上我只是把一些相關的東西列出來,具體需要你自己去搜索和證實。
- 2 回答
- 0 關注
- 721 瀏覽
添加回答
舉報