進程
1. 指在系統中正在啟動並執行一個應用程式;
2. 一個進程啟動之後會自動啟動一個主線程;
3. 一個進程可以有多個線程組成.
線程
1. 指作業系統對線程進行多任務調度,系統分配處理器時間資源的基本單元,
或者說進程之內獨立執行的一個單元。對於作業系統而言,其調度單元是線程。
2. 一個進程至少包括一個線程,通常將該線程稱為主線程。
多線程共存於應用程式中是現代作業系統中的基本特徵和重要標誌。用過UNIX作業系統的讀者知道進程,在UNIX作業系統中,每個應用程式的執行都在作業系統核心中登記一個進程標誌,作業系統根據分配的標誌對應用程式的執行進行調度和系統資源分派,但進程和線程有什麼區別呢?
進程和線程都是由作業系統所體會的程式啟動並執行基本單元,系統利用該基本單元實現系統對應用的並發性。進程和線程的區別在於:
線程的劃分尺度小於進程,使得多線程程式的並發性搞。
另外,進程在執行過程中擁有獨立的記憶體單元,而多個線程共用記憶體,從而極大地提高了程式的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程式啟動並執行入口、順序執行序列和程式的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分派。這就是進程和線程的重要區別。
進程(Process)是最初定義在Unix等多使用者、多任務作業系統環境下用於表示應用程式在記憶體環境中基本執行單元的概念。以Unix作業系統為例,進程是Unix作業系統環境中的基本成分、是系統資源分派的基本單位。Unix作業系統中完成的幾乎所有使用者管理和資源分派等工作都是通過作業系統對應用程式進程的控制來實現的。
C、C++、Java等語言編寫的來源程式經相應的編譯器編譯成可執行檔後,提交給電腦處理器運行。這時,處在可執行狀態中的應用程式稱為進程。從使用者角度來看,進程是應用程式的一個執行過程。從作業系統核心角度來看,進程代表的是作業系統分配的記憶體、CPU時間片等資源的基本單位,是為正在啟動並執行程式提供的運行環境。進程與應用程式的區別在於應用程式作為一個靜態檔案儲存體在電腦系統的硬碟等儲存空間中,而進程則是處於動態條件下由作業系統維護的系統資源管理實體。多任務環境下應用程式進程的主要特點包括:
●進程在執行過程中有記憶體單元的初始進入點,並且進程存活過程中始終擁有獨立的記憶體位址空間;
●進程的生存期狀態包括建立、就緒、運行、阻塞和死亡等類型;
●從應用程式進程在執行過程中向CPU發出的運行指令形式不同,可以將進程的狀態分為使用者態和核心態。處於使用者態下的進程執行的是應用程式指令、處於核心態下的應用程式進程執行的是作業系統指令。
在Unix作業系統啟動過程中,系統自動建立swapper、init等系統進程,用於管理記憶體資源以及對使用者進程進行調度等。在Unix環境下無論是由作業系統建立的進程還要由應用程式執行建立的進程,均擁有唯一的進程標識(PID)。
進程與Java線程的區別
應用程式在執行過程中存在一個記憶體空間的初始進入點地址、一個程式執行過程中的代碼執行序列以及用於標識進程結束的記憶體出口點地址,在進程執行過程中的每一時間點均有唯一的處理器指令與記憶體單元地址相對應。
Java語言中定義的線程(Thread)同樣包括一個記憶體進入點地址、一個出口點地址以及能夠順序執行的代碼序列。但是進程與線程的重要區別在於線程不能夠單獨執行,它必須運行在處於活動狀態的應用程式進程中,因此可以定義線程是程式內部的具有並發性的順序代碼流。
Unix作業系統和Microsoft Windows作業系統支援多使用者、多進程的並發執行,而Java語言支援應用程式進程內部的多個執行線程的並發執行。多線程的意義在於一個應用程式的多個邏輯單元可以並發地執行。但是多線程並不意味著多個使用者進程在執行,作業系統也不把每個線程作為獨立的進程來分配獨立的系統資源。進程可以建立其子進程,子進程與父進程擁有不同的可執行代碼和資料記憶體空間。而在用於代表應用程式的進程中多個線程共用資料記憶體空間,但保持每個線程擁有獨立的執行堆棧和程式執行內容(Context)。
基於上述區別,線程也可以稱為輕型進程 (Light Weight Process,LWP)。不同線程間允許任務協作和資料交換,使得在電腦系統資源消耗等方面非常廉價。
線程需要作業系統的支援,不是所有類型的電腦都支援多線程應用程式。Java程式設計語言將線程支援與語言運行環境結合在一起,提供了多任務並發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌後將大米放在電飯鍋裡,然後開始做菜。等菜做好了,飯熟了同時衣服也洗好了。
需要注意的是:在應用程式中使用多線程不會增加 CPU 的資料處理能力。只有在多CPU 的電腦或者在網路計算體繫結構下,將Java程式劃分為多個並發執行線程後,同時啟動多個線程運行,使不同的線程運行在基於不同處理器的Java虛擬機器中,才能提高應用程式的執行效率。
進程是啟動並執行程式,是作業系統分配資源的單元