(多)進程
進程是程序在計算機上的一次執行活動,即正在運行中的應用程序,通常稱為進程。當你運行一個程序,你就啟動了一個進程。每個進程都有自己獨立的地址空間(內存空間),每當用戶啟動一個進程時,操作系統就會為該進程分配一個獨立的內存空間,讓應用程序在這個獨立的內存空間中運行。
進程一般由程序
、數據集合
和進程控制塊
三部分組成。程序用於描述進程要完成的功能,是控制進程執行的指令集;數據集合是程序在執行時所需要的數據和工作區;程序控制塊(Program Control Block,簡稱PCB),包含進程的描述信息和控制信息,是進程存在的唯一標志。
進程具有的特征:
動態性:進程是程序的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;
並發性:任何進程都可以同其他進程一起並發執行;
獨立性:進程是系統進行資源分配和調度的一個獨立單位;
結構性:進程由程序、數據和進程控制塊三部分組成。
在同一個時間里,同一個計算機系統中如果允許兩個或兩個以上的進程處於運行狀態,這便是多進程
,也稱多任務。現代的操作系統幾乎都是多任務操作系統,能夠同時管理多個進程的運行。
多進程編程
時,子進程除代碼段與父進程共享外,其余部分完全是父進程的一個副本,子進程的所以資源都繼承父進程,也就是說二者不共享地址空間。兩個是單獨的空間,繼承以后就沒有交集了,子進程單獨運行(采用寫時復制技術)。
多進程優點:
- 每個進程互相獨立,不影響主程序的穩定性,子進程崩潰沒關系;
- 通過增加CPU,就可以容易擴充性能;
- 可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運行的模塊算法效率低也沒關系;
- 每個子進程都有4GB地址空間和相關資源,總體能夠達到的性能上限非常大。
多進程缺點:
- 邏輯控制復雜,需要和主程序交互;
- 需要跨進程邊界,如果有數據量傳送,需要通過各種IPC處理。
- 密集運算多進程調度開銷比較大;
最好是多進程和多線程結合,即根據實際的需要,每個CPU開啟一個子進程,這個子進程開啟多線程可以為若干同類型的數據進行處理。當然你也可以利用多線程+多CPU+輪詢方式來解決問題
(多)線程
線程是進程的一條執行路徑,線程在Unix系統下,通常被稱為輕量級的進程。
線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。
一個標准的線程
由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數據、進程空間、打開的文件)和一個或多個線程組成。
多線程編程
時,線程運行在進程當中,多線程共享進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但在同一進程的多個線程中,有各自的調用棧、寄存器環境(register context)、本地存儲(thread-local storage)。並且在一個子線程出錯或者退出時,一定不能調用return(exit),因為會導致進程結束,應調用pthread_exit()退出線程。
多線程優點:
- 無需跨進程邊界;
- 程序邏輯和控制方式簡單;
- 所有線程可以直接共享內存和變量等;
- 線程方式消耗的總資源比進程方式好;
多線程缺點:
- 每個線程與主程序共用地址空間,受限於4GB地址空間;
- 線程之間的同步和加鎖控制比較麻煩;
- 一個線程的崩潰影響到整個程序的穩定性;
- 到達一定的線程數程度后,即使再增加CPU也無法提高性能,例如在Linux環境下,每個線程私有空間大約是2M,因此運行1500個左右的線程數就已經極限了(當然線程的私用空間大小可以改變);
- 線程能夠提高的總性能有限,而且線程多了之后,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU。
用一張表格說明它們區別
參考:
https://blog.csdn.net/luoweifu/article/details/46595285