1. 程式人生 > >程序與執行緒之間的關係

程序與執行緒之間的關係

程序和執行緒之間的關係

轉載來自:https://www.cnblogs.com/losing-1216/p/5083097.html
程序概念

  程序是表示資源分配的基本單位,又是排程執行的基本單位。例如,使用者執行自己的程式,系統就建立一個程序,併為它分配資源,包括各種表格、記憶體空間、磁碟空間、I/O裝置等。然後,把該程序放人程序的就緒佇列。程序排程程式選中它,為它分配CPU以及其它有關資源,該程序才真正執行。所以,程序是系統中的併發執行的單位。

在Mac、Windows NT等採用微核心結構的作業系統中,程序的功能發生了變化:它只是資源分配的單位,而不再是排程執行的單位。在微核心系統中,真正排程執行的基本單位是執行緒。因此,實現併發功能的單位是執行緒。

執行緒概念

  執行緒是程序中執行運算的最小單位,亦即執行處理機排程的基本單位。如果把程序理解為在邏輯上作業系統所完成的任務,那麼執行緒表示完成該任務的許多可能的子任務之一。例如,假設使用者啟動了一個視窗中的資料庫應用程式,作業系統就將對資料庫的呼叫表示為一個程序。假設使用者要從資料庫中產生一份工資單報表,並傳到一個檔案中,這是一個子任務;在產生工資單報表的過程中,使用者又可以輸人資料庫查詢請求,這又是一個子任務。這樣,作業系統則把每一個請求――工資單報表和新輸人的資料查詢表示為資料庫程序中的獨立的執行緒。執行緒可以在處理器上獨立排程執行,這樣,在多處理器環境下就允許幾個執行緒各自在單獨處理器上進行。作業系統提供執行緒就是為了方便而有效地實現這種併發性

引入執行緒的好處

(1)易於排程。

(2)提高併發性。通過執行緒可方便有效地實現併發性。程序可建立多個執行緒來執行同一程式的不同部分。

(3)開銷少。建立執行緒比建立程序要快,所需開銷很少。。

(4)利於充分發揮多處理器的功能。通過建立多執行緒程序(即一個程序可具有兩個或更多個執行緒),每個執行緒在一個處理器上執行,從而實現應用程式的併發性,使每個處理器都得到充分執行。

程序和執行緒的關係

(1)一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒。執行緒是作業系統可識別的最小執行和排程單位。

(2)資源分配給程序,同一程序的所有執行緒共享該程序的所有資源。 同一程序中的多個執行緒共享程式碼段(程式碼和常量),資料段(全域性變數和靜態變數),擴充套件段(堆儲存)。但是每個執行緒擁有自己的棧段,棧段又叫執行時段,用來存放所有區域性變數和臨時變數。

(3)處理機分給執行緒,即真正在處理機上執行的是執行緒。

(4)執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。

處理機管理是作業系統的基本管理功能之一,它所關心的是處理機的分配問題。也就是說把CPU(中央處理機)的使用權分給某個程式,通常把這個正準備進入記憶體的程式稱為作業,當這個作業進入記憶體後我們把它稱為程序。

自從60年代提出程序概念,在作業系統中一直都是以程序作為能獨立執行的基本單位的。直到80年代中期,人們又提出了比程序更小的能獨立執行的基本單位 ——執行緒;試圖用它來提高系統內程式併發執行的速度,從而可進一步提高系統的吞吐量。近幾年,執行緒概念已得到了廣泛應用,不僅在新推出的作業系統中,大多 都已引入了執行緒概念,而且在新推出的資料庫管理系統和其它應用軟體中,也都紛紛引入了執行緒,來改善系統的效能。

如果說,在作業系統中引入程序的目的,是為了使多個程式併發執行,以改善資源利用率及提高系統的吞吐量;那麼,在作業系統中再引入執行緒則是為了減少程式並 發執行時所付出的時空開銷,使作業系統具有更好的併發性。為了說明這一點,我們首先回顧程序的兩個基本屬性:

(1)程序是一個可擁有資源的獨立單位;

(2)程序同時又是——個可以獨立排程和分派的基本單位。正是由於程序具有這兩個基本屬性,才使之成為一個能獨立執行的基本單位,從而也就構成了程序併發執行的基礎。

然而為使程式能併發執行,系統還必須進行以下的一系列操作:

(1)建立程序。系統在建立程序時,必須為之分配其所必需的、除處理機以外的所有資源。如記憶體空間、I/0裝置以及建立相應的PCB。

(2)撤消程序。系統在撤消程序時,又必須先對這些資源進行回收操作,然後再撤消PCB。

(3)程序切換。在對程序進行切換時,由於要保留當前程序的CPU環境和設定新選中程序的CPU環境,為此需花費不少處理機時間。

簡言之,由於程序是一個資源擁有者,因而在程序的建立、撤消和切換中,系統必須為之付出較大的時空開銷。也正因為如此,在系統中所設定的程序數目不宜過多,程序切換的頻率也不宜太高,但這也就限制了併發程度的進一步提高。

如何能使多個程式更好地併發執行,同時又儘量減少系統的開銷,已成為近年來設計作業系統時所追求的重要目標。於是,有不少作業系統的學者們想到,可否將進 程的上述屬性分開,由作業系統分開來進行處理。即對作為排程和分派的基本單位,不同時作為獨立分配資源的單位,以使之輕裝執行;而對擁有資源的基本單位, 又不頻繁地對之進行切換。正是在這種思想的指導下,產生了執行緒概念。

在引入執行緒的作業系統中,執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源 (如程式計數器、一組暫存器和棧),但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒;同一程序中的多個執行緒 之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中也呈現出間斷性。相應地,執行緒也同樣有就緒、阻塞和執行三種基本狀態,有的系統中執行緒還有終 止狀態。

執行緒與程序的比較

執行緒具有許多傳統程序所具有的特徵,故又稱為輕型程序(Light—Weight Process)或程序元;而把傳統的程序稱為重型程序(Heavy—Weight Process),它相當於只有一個執行緒的任務。在引入了執行緒的作業系統中,通常一個程序都有若干個執行緒,至少需要一個執行緒。下面,我們從排程、併發性、 系統開銷、擁有資源等方面,來比較執行緒與程序。

1.排程

在傳統的作業系統中,擁有資源的基本單位和獨立排程、分派的基本單位都是程序。而在引入執行緒的作業系統中,則把執行緒作為排程和分派的基本單位。而把程序作 為資源擁有的基本單位,使傳統程序的兩個屬性分開,執行緒便能輕裝執行,從而可顯著地提高系統的併發程度。在同一程序中,執行緒的切換不會引起程序的切換,在 由一個程序中的執行緒切換到另一個程序中的執行緒時,將會引起程序的切換。

2.併發性

在引入執行緒的作業系統中,不僅程序之間可以併發執行,而且在一個程序中的多個執行緒之間,亦可併發執行,因而使作業系統具有更好的併發性,從而能更有效地使 用系統資源和提高系統吞吐量。例如,在一個未引入執行緒的單CPU作業系統中,若僅設定一個檔案服務程序,當它由於某種原因而被阻塞時,便沒有其它的檔案服 務程序來提供服務。在引入了執行緒的作業系統中,可以在一個檔案服務程序中,設定多個服務執行緒,當第一個執行緒等待時,檔案服務程序中的第二個執行緒可以繼續運 行;當第二個執行緒阻塞時,第三個執行緒可以繼續執行,從而顯著地提高了檔案服務的質量以及系統吞吐量。

3.擁有資源

不論是傳統的作業系統,還是設有執行緒的作業系統,程序都是擁有資源的一個獨立單位,它可以擁有自己的資源。一般地說,執行緒自己不擁有系統資源(也有一點必 不可少的資源),但它可以訪問其隸屬程序的資源。亦即,一個程序的程式碼段、資料段以及系統資源,如已開啟的檔案、I/O裝置等,可供問一程序的其它所有線 程共享。

4.系統開銷

由於在建立或撤消程序時,系統都要為之分配或回收資源,如記憶體空間、I/o裝置等。因此,作業系統所付出的開銷將顯著地大於在建立或撤消執行緒時的開銷。類 似地,在進行程序切換時,涉及到整個當前程序CPU環境的儲存以及新被排程執行的程序的CPU環境的設定。而執行緒切換隻須儲存和設定少量暫存器的內容,並 不涉及儲存器管理方面的操作。可見,程序切換的開銷也遠大於執行緒切換的開銷。此外,由於同一程序中的多個執行緒具有相同的地址空間,致使它們之間的同步和通訊的實現,也變得比較容易。在有的系統中,執行緒的切換、同步和通訊都無須it