程序是程式在計算機上的一次執行活動,即正在執行中的應用程式,通常稱為程序。當你執行乙個程式,你就啟動了乙個程序。每個程序都有自己獨立的位址空間(記憶體空間),每當使用者啟動乙個程序時,作業系統就會為該程序分配乙個獨立的記憶體空間,讓應用程式在這個獨立的記憶體空間中執行。
程序一般由程式
、資料集合
和程序控制塊
三部分組成。程式用於描述程序要完成的功能,是控制程序執行的指令集;資料集合是程式在執行時所需要的資料和工作區;程式控制塊(program control block,簡稱pcb),包含程序的描述資訊和控制資訊,是程序存在的唯一標誌。
程序具有的特徵:
動態性:程序是程式的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;
併發性:任何程序都可以同其他程序一起併發執行;
獨立性:程序是系統進行資源分配和排程的乙個獨立單位;
結構性:程序由程式、資料和程序控制塊三部分組成。
在同乙個時間裡,同乙個計算機系統中如果允許兩個或兩個以上的程序處於執行狀態,這便是多程序
,也稱多工。現代的作業系統幾乎都是多工作業系統,能夠同時管理多個程序的執行。
多程序程式設計
時,子程序除**段與父程序共享外,其餘部分完全是父程序的乙個副本,子程序的所以資源都繼承父程序,也就是說二者不共享位址空間。兩個是單獨的空間,繼承以後就沒有交集了,子程序單獨執行(採用寫時複製技術)。
每個程序互相獨立,不影響主程式的穩定性,子程序崩潰沒關係;
通過增加cpu,就可以容易擴充效能;
可以儘量減少執行緒加鎖/解鎖的影響,極大提高效能,就算是執行緒執行的模組演算法效率低也沒關係;
邏輯控制複雜,需要和主程式互動;
需要跨程序邊界,如果有資料量傳送,需要通過各種ipc處理。
密集運算多程序排程開銷比較大;
最好是多程序和多執行緒結合,即根據實際的需要,每個cpu開啟乙個子程序,這個子程序開啟多執行緒可以為若干同型別的資料進行處理。當然你也可以利用多執行緒+多cpu+輪詢方式來解決問題
執行緒是程序的一條執行路徑,執行緒在unix系統下,通常被稱為輕量級的程序。
執行緒是程式執行中乙個單一的順序控制流程,是程式執行流的最小單元,是處理器排程和分派的基本單位。乙個程序可以有乙個或多個執行緒,各個執行緒之間共享程式的記憶體空間(也就是所在程序的記憶體空間)。
乙個標準的執行緒
由執行緒id、當前指令指標(pc)、暫存器和堆疊組成。而程序由記憶體空間(**、資料、程序空間、開啟的檔案)和乙個或多個執行緒組成。
多執行緒程式設計
時,執行緒執行在程序當中,多執行緒共享程序中的全部系統資源,如虛擬位址空間,檔案描述符和訊號處理等等。但在同一程序的多個執行緒中,有各自的呼叫棧、暫存器環境(register context)、本地儲存(thread-local storage)。並且在乙個子執行緒出錯或者退出時,一定不能呼叫return(exit),因為會導致程序結束,應呼叫pthread_exit()退出執行緒。
無需跨程序邊界;
程式邏輯和控制方式簡單;
所有執行緒可以直接共享記憶體和變數等;
執行緒方式消耗的總資源比程序方式好;
每個執行緒與主程式共用位址空間,受限於4gb位址空間;
執行緒之間的同步和加鎖控制比較麻煩;
乙個執行緒的崩潰影響到整個程式的穩定性;
到達一定的執行緒數程度後,即使再增加cpu也無法提高效能,例如在linux環境下,每個執行緒私有空間大約是2m,因此執行1500個左右的執行緒數就已經極限了(當然執行緒的私用空間大小可以改變);
執行緒能夠提高的總效能有限,而且執行緒多了之後,執行緒本身的排程也是乙個麻煩事兒,需要消耗較多的cpu。
參考:
Linux 程序與執行緒的區別
程序 程式的 個執行例項。分配系統資源 cpu時間,記憶體 的實體。執行緒 乙個程序內部的控制序列。區別 1 程序是資源競爭的基本單位 執行緒是排程的基本單位。2 程序是資源管理的最小單位 執行緒是程式執行的最小單位 3 乙個程序可以由多個執行緒組成,至少有乙個執行執行緒 執行緒與同屬乙個程序的其他...
Linux中線程與程序的區別
自 linux有兩種不同的函式來建立程序 fork函式,vfork函式。兩個函式都是從父程序拷貝出乙個新程序,但是也有區別。下面是fork和vfork的定義。定義於中。本段 源於kernel 4.4版本。fork系統呼叫 syscall define0 fork syscall define0 vf...
執行緒與程序的區別
原文 程序 process 和執行緒 thread 是作業系統的基本概念,但是它們比較抽象,不容易掌握。最近,我讀到一篇材料,發現有乙個很好的模擬,可以把它們解釋地清晰易懂 1 計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2 假定工廠的電力有限,一次只能供給乙個車間使用...