Linux下進程與線程的區別


(多)進程

進程是程序在計算機上的一次執行活動,即正在運行中的應用程序,通常稱為進程。當你運行一個程序,你就啟動了一個進程。每個進程都有自己獨立的地址空間(內存空間),每當用戶啟動一個進程時,操作系統就會為該進程分配一個獨立的內存空間,讓應用程序在這個獨立的內存空間中運行。
進程一般由程序數據集合進程控制塊三部分組成。程序用於描述進程要完成的功能,是控制進程執行的指令集;數據集合是程序在執行時所需要的數據和工作區;程序控制塊(Program Control Block,簡稱PCB),包含進程的描述信息和控制信息,是進程存在的唯一標志。
進程具有的特征:
動態性:進程是程序的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;
並發性:任何進程都可以同其他進程一起並發執行;
獨立性:進程是系統進行資源分配和調度的一個獨立單位;
結構性:進程由程序、數據和進程控制塊三部分組成。

在同一個時間里,同一個計算機系統中如果允許兩個或兩個以上的進程處於運行狀態,這便是多進程,也稱多任務。現代的操作系統幾乎都是多任務操作系統,能夠同時管理多個進程的運行。

多進程編程時,子進程除代碼段與父進程共享外,其余部分完全是父進程的一個副本,子進程的所以資源都繼承父進程,也就是說二者不共享地址空間。兩個是單獨的空間,繼承以后就沒有交集了,子進程單獨運行(采用寫時復制技術)。

多進程優點:

  1. 每個進程互相獨立,不影響主程序的穩定性,子進程崩潰沒關系;
  2. 通過增加CPU,就可以容易擴充性能;
  3. 可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運行的模塊算法效率低也沒關系;
  4. 每個子進程都有4GB地址空間和相關資源,總體能夠達到的性能上限非常大。

多進程缺點:

  1. 邏輯控制復雜,需要和主程序交互;
  2. 需要跨進程邊界,如果有數據量傳送,需要通過各種IPC處理。
  3. 密集運算多進程調度開銷比較大;

最好是多進程和多線程結合,即根據實際的需要,每個CPU開啟一個子進程,這個子進程開啟多線程可以為若干同類型的數據進行處理。當然你也可以利用多線程+多CPU+輪詢方式來解決問題

(多)線程

線程是進程的一條執行路徑,線程在Unix系統下,通常被稱為輕量級的進程。
線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。
一個標准的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數據、進程空間、打開的文件)和一個或多個線程組成。

多線程編程時,線程運行在進程當中,多線程共享進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但在同一進程的多個線程中,有各自的調用棧、寄存器環境(register context)、本地存儲(thread-local storage)。並且在一個子線程出錯或者退出時,一定不能調用return(exit),因為會導致進程結束,應調用pthread_exit()退出線程。

多線程優點:

  1. 無需跨進程邊界;
  2. 程序邏輯和控制方式簡單;
  3. 所有線程可以直接共享內存和變量等;
  4. 線程方式消耗的總資源比進程方式好;

多線程缺點:

  1. 每個線程與主程序共用地址空間,受限於4GB地址空間;
  2. 線程之間的同步和加鎖控制比較麻煩;
  3. 一個線程的崩潰影響到整個程序的穩定性;
  4. 到達一定的線程數程度后,即使再增加CPU也無法提高性能,例如在Linux環境下,每個線程私有空間大約是2M,因此運行1500個左右的線程數就已經極限了(當然線程的私用空間大小可以改變);
  5. 線程能夠提高的總性能有限,而且線程多了之后,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU。

用一張表格說明它們區別

在這里插入圖片描述

參考:
https://blog.csdn.net/luoweifu/article/details/46595285

https://blog.csdn.net/ljlstart/article/details/51092846

https://www.php.cn/faq/416853.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM