1. 程式人生 > >程序,執行緒,程式的區別和聯絡

程序,執行緒,程式的區別和聯絡

程序和程式區別和聯絡表現在以下方面:
1)程式只是一組指令的有序集合,它本身沒有任何執行的含義,它只是
 一個靜態的實體。而程序則不同,它是程式在某個資料集上的執行。
 程序是一個動態的實體,它有自己的生命週期。它因建立而產生,因
 排程而執行,因等待資源或事件而被處於等待狀態,因完成任務而被
 撤消。反映了一個程式在一定的資料集上執行的全部動態過程。
2)程序和程式並不是一一對應的,一個程式執行在不同的資料集上就成
 為不同的程序,可以用程序控制塊來唯一地標識每個程序。而這一點
 正是程式無法做到的,由於程式沒有和資料產生直接的聯絡,既使是
 執行不同的資料的程式,他們的指令的集合依然是一樣的,所以無法
 唯一地標識出這些運行於不同資料集上的程式。一般來說,一個程序
 肯定有一個與之對應的程式,而且只有一個。而一個程式有可能沒有
 與之對應的程序(因為它沒有執行),也有可能有多個程序與之對應(運
 行在幾個不同的資料集上)。
3)程序還具有併發性和交往性,這也與程式的封閉性不同。
----------------------------------------------------------------------------------------------

程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。程序和執行緒的區別在於:

簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒. 
執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。
另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.
執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.
一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行.

----------------------------------------------------------------------------------------------

程序和執行緒的區別 
 
說法一:程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行

 

說法二:程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。程序和執行緒的區別在於:

簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒. 

執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

 

說法三:多執行緒共存於應用程式中是現代作業系統中的基本特徵和重要標誌。用過UNIX作業系統的讀者知道程序,在UNIX作業系統中,每個應用程式的執行都在作業系統核心中登記一個程序標誌,作業系統根據分配的標誌對應用程式的執行進行排程和系統資源分配,但程序和執行緒有什麼區別呢?

程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。程序和執行緒的區別在於:

執行緒的劃分尺度小於程序,使得多執行緒程式的併發性搞。

另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

程序(Process)是最初定義在Unix等多使用者、多工作業系統環境下用於表示應用程式在記憶體環境中基本執行單元的概念。以Unix作業系統為例,程序是Unix作業系統環境中的基本成分、是系統資源分配的基本單位。Unix作業系統中完成的幾乎所有使用者管理和資源分配等工作都是通過作業系統對應用程式程序的控制來實現的。 

C、C++、Java等語言編寫的源程式經相應的編譯器編譯成可執行檔案後,提交給計算機處理器執行。這時,處在可執行狀態中的應用程式稱為程序。從使用者角度來看,程序是應用程式的一個執行過程。從作業系統核心角度來看,程序代表的是作業系統分配的記憶體、CPU時間片等資源的基本單位,是為正在執行的程式提供的執行環境。程序與應用程式的區別在於應用程式作為一個靜態檔案儲存在計算機系統的硬碟等儲存空間中,而程序則是處於動態條件下由作業系統維護的系統資源管理實體。多工環境下應用程式程序的主要特點包括: 

●程序在執行過程中有記憶體單元的初始入口點,並且程序存活過程中始終擁有獨立的記憶體地址空間; 

●程序的生存期狀態包括建立、就緒、執行、阻塞和死亡等型別; 

●從應用程式程序在執行過程中向CPU發出的執行指令形式不同,可以將程序的狀態分為使用者態和核心態。處於使用者態下的程序執行的是應用程式指令、處於核心態下的應用程式程序執行的是作業系統指令。 

在Unix作業系統啟動過程中,系統自動建立swapper、init等系統程序,用於管理記憶體資源以及對使用者程序進行排程等。在Unix環境下無論是由作業系統建立的程序還要由應用程式執行建立的程序,均擁有唯一的程序標識(PID)。 

說法四:應用程式在執行過程中存在一個記憶體空間的初始入口點地址、一個程式執行過程中的程式碼執行序列以及用於標識程序結束的記憶體出口點地址,在程序執行過程中的每一時間點均有唯一的處理器指令與記憶體單元地址相對應。 

Java語言中定義的執行緒(Thread)同樣包括一個記憶體入口點地址、一個出口點地址以及能夠順序執行的程式碼序列。但是程序與執行緒的重要區別在於執行緒不能夠單獨執行,它必須執行在處於活動狀態的應用程式程序中,因此可以定義執行緒是程式內部的具有併發性的順序程式碼流。 

Unix作業系統和Microsoft Windows作業系統支援多使用者、多程序的併發執行,而Java語言支援應用程式程序內部的多個執行執行緒的併發執行。多執行緒的意義在於一個應用程式的多個邏輯單元可以併發地執行。但是多執行緒並不意味著多個使用者程序在執行,作業系統也不把每個執行緒作為獨立的程序來分配獨立的系統資源。程序可以建立其子程序,子程序與父程序擁有不同的可執行程式碼和資料記憶體空間。而在用於代表應用程式的程序中多個執行緒共享資料記憶體空間,但保持每個執行緒擁有獨立的執行堆疊和程式執行上下文(Context)。 

基於上述區別,執行緒也可以稱為輕型程序 (Light Weight Process,LWP)。不同執行緒間允許任務協作和資料交換,使得在計算機系統資源消耗等方面非常廉價。 

執行緒需要作業系統的支援,不是所有型別的計算機都支援多執行緒應用程式。Java程式設計語言將執行緒支援與語言執行環境結合在一起,提供了多工併發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌後將大米放在電飯鍋裡,然後開始做菜。等菜做好了,飯熟了同時衣服也洗好了。 

需要注意的是:在應用程式中使用多執行緒不會增加 CPU 的資料處理能力。只有在多CPU 的計算機或者在網路計算體系結構下,將Java程式劃分為多個併發執行執行緒後,同時啟動多個執行緒執行,使不同的執行緒執行在基於不同處理器的Java虛擬機器中,才能提高應用程式的執行效率。