線程的概述
線程和進程
進程的特徵
並發和並行
多線程的優勢
1、線程概述
幾乎所有的作業系統都支援同時運行多個任務,一個任務通常就是一個程式,每個運行中的程式就是一個進程。
當一個程式運行時,內部可能包含了多個順序執行流,每個順序執行流就是一個線程。
2、線程和進程
幾乎所有的作業系統都有進程的概念,所有運行中的任務通常對應一條進程。當一個程式進入記憶體運行,就是一個進程了。
進程是處於運行中的程式,具有一定的獨立能力,進程是系統進行資源分派和調度的一個獨立單位。
進程特徵:
A、獨立性:進程是系統中獨立存在的實體,可以擁有自己獨立的資源,每個進程都擁有自己的私人地址地址。
在沒有經過進程本身允許的情況下,一個使用者進程不可以訪問其他進程地址空間。
B、動態性:進程和程式的區別在於,程式只是一個靜態指令集合,而進程是一個正在系統中活動的指令集合。
在程式中加入了時間概念,進程具有自己的生命週期和各種不同的狀態,這些概念是程式不具備的。
C、並發性:多個進程可以在單個處理器上並發執行,多個進程之間不會互相影響。
多線程則擴充了多進程的概念,使得同一個進程可以同時並發處理多個任務。線程也被稱為輕量級進程(Lightweight Process),線程是進程的執行單元。
就像進程在作業系統中的地位一樣,線程在程式中是獨立、並發執行流。當進程被初始化後,主線程就被建立。對於絕大多數應用程式來說,通常僅要一個主線程,
但我們也可以在該進程內建立多條順序執行流,這些順序執行流就是線程,每條線程也互相獨立的。
線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程可以擁有自己的堆、棧、程式計數器、局部變數,但不能擁有系統資源,
它與父進程的其他線程共用該進程所有的全部資源。因為多個線程共用父進程的全部資源。
線程可以完成一定的任務,可與其他線程共用父進程中的變數和部分環境,相互之間協作共同完成進程所要完成的任務。
線程是獨立啟動並執行,它並不知道進程中是否還有其他進程存在。線程的執行是搶佔方式的,也就是說,當前啟動並執行線程在任何時候都可以被掛起,以便其他線程運行。
一個線程可以建立和撤銷另一個線程,同一個進程中的多個線程可以並發執行。
綜述:一個程式運行後至少有一個進程,一個進程可以包含多個線程。至少包含一個線程。
3、並發和並行
並發性(concurrency)和並行性(parallel)是兩個概念;
並行指在同一時刻,有多條指令(線程)在多個處理器上同時執行;
並髮指在同一時刻只能有一個指令(線程)執行,但多個進程指令被快速輪換執行,使得宏觀上具有多個進程同時執行的效果。
4、多線程的優勢
線程劃分尺度小於進程,使得多線程劃分的並發性高。進程在執行時有自己獨立的單元,多個線程共用記憶體,從而提高了運行效率。
線程比進程具有更高的效能,這是由於同一個進程中的線程都有共性:多個線程將共用同一個進程的虛擬空間。
線程共性的環境包括:進程程式碼片段、進程共有資料等。線程很容易就利用共性的資料進行通訊。
當作業系統建立一個進程時,必須給該進程分別獨立的記憶體空間,並分配大量相關的資源;但建立一個線程則簡單得多,因此多線程來實現並發要比多進程實現並發的效能高得多。
多線程優點:
A、進程之間不能共用記憶體,但線程之間共用記憶體非常容易。
B、系統建立進程需要為該進程重新分配系統資源,但建立線程則代價要小得多,因此使用線程來實現多任務並發比多進程的效率高。
C、Java語言內建多線程功能支援,而不是單純的作為底層作業系統的調度方式,從而簡化Java的多線程編程。