首先說進程,所謂進程就是應用程序執行的過程,就是個抽象說法,而程序就是一個有序指令的集合。初始的進程就叫父進程(PPID),由此派生的就叫子進程(PID)。一個應用程序就能夠有多個進程,好比谷歌瀏覽器,它的進程數就是拓展數加上頁面數的總和,它是個多進程程序。 算法
而線程,是在依附在進程之下的;多線程是將多任務的思想延續到應用程序,因此將一個單獨應用程序的具體操做分紅具體線程,各線程都能並行運行。例如,火狐瀏覽器,用的就是多線程模式,其缺點就是一旦某線程內存崩潰,可能會致使整個進程崩潰。
瀏覽器
多線程的優勢: 多線程
無需跨進程邊界; 程序邏輯和控制方式簡單; 全部線程能夠直接共享內存和變量等; 線程方式消耗的總資源比進程方式好; 多線程缺點: 併發
每一個線程與主程序共用地址空間,受限於2GB地址空間; 線程之間的同步和加鎖控制比較麻煩; 一個線程的崩潰可能影響到整個程序的穩定性; 到達必定的線程數程度後,即便再增長CPU也沒法提升性能,例如Windows Server 2003,大約是1500個左右的線程數就快到極限了(線程堆棧設定爲1M),若是設定線程堆棧爲2M,還達不到1500個線程總數; 線程可以提升的總性能有限,並且線程多了以後,線程自己的調度也是一個麻煩事兒,須要消耗較多的CPU 性能
多進程優勢: 大數據
每一個進程互相獨立,不影響主程序的穩定性,子進程崩潰不要緊; 經過增長CPU,就能夠容易擴充性能; 能夠儘可能減小線程加鎖/解鎖的影響,極大提升性能,就算是線程運行的模塊算法效率低也不要緊; 每一個子進程都有2GB地址空間和相關資源,整體可以達到的性能上限很是大 多線程缺點: spa
邏輯控制複雜,須要和主程序交互; 須要跨進程邊界,若是有大數據量傳送,就不太好,適合小數據量傳送、密集運算 多進程調度開銷比較大; 最好是多進程和多線程結合,即根據實際的須要,每一個CPU開啓一個子進程,這個子進程開啓多線程能夠爲若干同類型的數據進行處理。固然你也能夠利用多線程+多CPU+輪詢方式來解決問題…… 操作系統
方法和手段是多樣的,關鍵是本身看起來實現方便有可以知足要求,代價也合適。 線程
--------------------------------------------------------- 設計
進程的優勢:
1)順序程序的特色:具備封閉性和可再現性;
2)程序的併發執行和資源共享。多道程序設計出現後,實現了程序的併發執行和資源共享,提升了系統的效率和系統的資源利用率。 進程的缺點:
操做系統調度切換多個線程要比切換調度進程在速度上快的多。並且進程間內存沒法共享,通信也比較麻煩。
線程之間因爲共享進程內存空間,因此交換數據很是方便;在建立或撤消進程時,因爲系統都要爲之分配和回收資源,致使系統的開銷明顯大於建立或撤消線程時的開銷。
線程的優勢:
1)它是一種很是"節儉"的多任務操做方式。在Linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,創建衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工做方式。而運行於一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠遠小於啓動一個進程所花費的空間,並且,線程間彼此切換所需的時間也遠遠小於進程間切換所須要的時間。固然,在具體的系統上,這個數據可能會有較大的區別;
2)線程間方便的通訊機制,因爲同一進程下的線程之間共享數據空間,因此一個線程的數據能夠直接爲其它線程所用,這不只快捷,並且方便;
3)使多CPU系統更加有效。操做系統會保證當線程數不大於CPU數目時,不一樣的線程運行於不一樣的CPU上;
4)改善程序結構。一個既長又複雜的進程能夠考慮分爲多個線程,成爲幾個獨立或半獨立的運行部分,這樣的程序會利於理解和修改。 線程的缺點: 1.調度時, 要保存線程狀態,頻繁調度, 須要佔用大量的機時; 2.程序設計上容易出錯(線程同步問題)。