1. 程式人生 > >程序管理九(執行緒)

程序管理九(執行緒)

  • 執行緒的概念

引入程序的目的是使多道程式能併發執行,以提高資源利用率和系統吞吐量。自從提出了程序的概念後,在作業系統中一直都是以程序作為資源分配和排程執行的基本單位。程序作為一個資源擁有者,在建立、撤銷、切換中,系統必須為之付出較大時空開銷。所以系統中程序的數量不宜過多,程序切換的頻率不宜過高,但這也就限制了併發程度的進一步提高。

為了進一步提高系統的併發度,人們考慮把程序的“資源分配單位”與“排程執行單位”分離開來,程序作為系統資源分配和保護的獨立單位,不需要頻繁地切換;執行緒作為系統排程和分派的基本單位,能輕裝執行,會被頻繁地排程和切換。在這種指導思想下,產生了執行緒的概念。引入執行緒是為了提高系統的執行效率,減少處理機的空轉時間和排程切換(保護現場資訊)的時空開銷,提高作業系統的併發效能。

一個程序內的基本排程單位稱為執行緒。執行緒最直接的理解就是“輕量級程序”,執行緒自己不擁有系統資源,只擁有自己在執行中必不可少的資源,包括程式計數器、暫存器集合和堆疊。但它可與同屬一個程序的其他執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤銷另一個執行緒,同一程序中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中呈現出間斷性,因此執行緒也有就緒、阻塞和執行三種基本狀態,線上程併發中也存在同步和互斥機制。

引入執行緒的優點:

(1)併發執行發生線上程實體上,因而系統對處理機的分配也發生線上程之間,而執行緒間的切換改善了系統時空開銷,包括記憶體管理、執行緒切換等。

(2)系統建立或終止一個執行緒的開銷要比建立或終止一個程序的開銷要小得多。

(3)執行緒之間通訊的效率要高於程序之間通訊的效率。程序間通訊要核心介入,而同個程序的多個執行緒共享一個地址空間,所以通訊時無需核心介入。

儘管執行緒可以提高系統的執行效率,但並不是在所有的計算機系統中,執行緒都是適用的,事實上在那些很少做程序排程和切換的實時系統、個人系統中,由於任務的單一性,設定執行緒反而會佔用更多的系統資源。

適用執行緒的最大好處是在有多個任務需要處理機處理時,減少處理機的切換時間;而且,執行緒的建立和結束所需要的系統開銷也比程序的建立和結束要小得多。由此,可以推出最適合適用執行緒的系統是多處理機系統和網路系統或分散式系統。在多處理機系統中,同一使用者程式可以根據不同的功能劃分為不同的執行緒,放在不同的處理機上執行。在網路或分散式系統中,伺服器可對多個不同使用者的請求按不同的執行緒進行處理,從而提高系統的處理速度和效率。

  • 執行緒與程序

在多執行緒作業系統中,把執行緒作為獨立執行(或排程)的基本單位,此時的程序已不再是一個基本的可執行實體。但程序仍具有與執行相關的狀態,所謂程序處於執行態實際上是指該程序中某執行緒正在執行。

執行緒的主要屬性

(1)執行緒是一個輕型實體,它不擁有系統資源,但每個執行緒都應有一個唯一的識別符號和一個執行緒控制塊,執行緒控制塊記錄了執行緒執行的暫存器和棧等現場狀態。

(2)不同的執行緒可以執行相同的程式,即同一個服務程式被不同的使用者呼叫時,作業系統為它們建立成不同的執行緒。

(3)同一程序的各個執行緒共享該程序所擁有的資源。

(4)執行緒是處理器的獨立排程單位,多個執行緒是可以併發執行的。在單CPU的計算機系統中,各執行緒可交替地佔用CPU;在多CPU的計算機系統中,各執行緒可同時佔用不同的CPU,若各個CPU同時為一個程序內的各執行緒服務,則可縮短程序的處理時間。

執行緒與程序的比較

(1)排程。程序在傳統的作業系統中,既是資源的擁有者,也是系統排程和分派的單位。而在引入執行緒之後,程序僅作為資源的分配單位,執行緒作為排程和分派的單位。在統一程序內,執行緒的切換不會引起程序的切換,而由一個程序中的執行緒切換到另一個程序中的執行緒時,才會發生程序切換。

(2)併發性。在引入執行緒的作業系統中,不僅程序之間可以併發執行,而且在一個程序內的多個執行緒之間也同樣可以併發執行,因而使系統具有更好的併發性,系統資源利用率和系統吞吐量得到提高。

(3)系統資源。在引入執行緒的作業系統中,執行緒成為了被排程和分派的基本單位。執行緒基本不擁有資源,只有一些執行所必須的資源,但它可以和程序內其他執行緒共享程序所擁有的全部資源,即擁有一個程序的程式碼段、資料段以及系統資源。

(4)系統開銷。在建立和撤銷程序時,系統都要進行資源分配和回收,如記憶體空間、I/O裝置等。因此,作業系統所付出的時空開銷顯著地大於執行緒建立和撤銷的開銷。相類似地,在程序進行切換時,涉及當前程序的現場儲存,以及新選擇程序的上下文恢復。而執行緒的切換隻需儲存和設定少量的暫存器內容,並不涉及儲存器管理方面的操作。由此可見,程序間切換的開銷也大於執行緒間切換的開銷。此外,由於同一程序內多個執行緒具有相同的地址空間,因而執行緒之間的同步和通訊也變得更加容易。

  • 執行緒的實現方式

​​​​​​​執行緒已經在很多系統中實現,但各系統的實現方式並不完全相同。執行緒實現的方式有使用者級執行緒和核心級執行緒兩種。有些作業系統,例如linux或solaris2.x,同時提供使用者級執行緒和核心級執行緒兩種方式。

使用者級執行緒的管理過程全部由使用者程式完成,作業系統核心只對程序進行管理。由於這些執行緒都是設定在使用者空間,而執行緒所執行的操作也無需核心的幫助,因而核心完全不知道使用者級執行緒的存在。為了對使用者級執行緒進行管理,作業系統提供一個在使用者空間執行的執行緒庫。該執行緒庫提供建立、排程、撤銷執行緒的功能。同時,該執行緒庫也提供執行緒間的通訊,執行緒的執行以及儲存執行緒上下文的功能。當一個執行緒被建立時,執行緒庫為其生成相應的執行緒控制塊等資料結構,併為執行緒控制塊中的引數賦值和把該執行緒置於就緒狀態,其處理過程與程序建立過程大致相似。不同之處如下:

(1)使用者級執行緒的排程演算法和排程過程全部由使用者自行選擇和確定,與作業系統核心無關。在使用者級執行緒系統中,作業系統核心的排程單位仍是程序。如果程序的排程區間為T,則在T區間內,使用者可以根據自己的需要設定不同執行緒排程演算法。

(2)使用者級執行緒的排程演算法只進行執行緒上下文切換而不進行處理機切換,且其執行緒上下文切換是在核心不參與的情況下進行的。也就是說,執行緒上下文切換隻是在使用者站、使用者暫存器等之間進行切換,不涉及物理機的狀態。

(3)因為使用者級執行緒的上下文切換與核心無關。所以可能出現如下情況:即當一個程序由於I/O中斷或時間片用完等造成該程序退出處理機,而屬於該程序的執行中執行緒仍處於執行狀態。也就是說,儘管相關程序的狀態是阻塞的或等待的,但所屬執行緒狀態確實執行的。

核心級執行緒由作業系統核心進行管理。作業系統核心給應用程式提供相應的系統呼叫和應用程式介面API,以使使用者程式可以建立、執行、撤銷執行緒。

與使用者執行緒不同,核心級執行緒既可以被排程到一個處理機上併發執行,也可以被排程到不同的處理機上併發執行。作業系統核心既負責程序的排程,也負責程序內不同執行緒的排程工作。因此,核心級執行緒不會出現程序處於阻塞狀態,而執行緒處於執行狀態的情況。

另外,核心級執行緒技術也可用於核心程式自身,從而提高作業系統核心程式的執行效率。在同一個程序中,從一個執行緒切換到另一個執行緒時,處理機需要從使用者態轉換到核心態進行,這是因為使用者程序的執行緒在使用者態執行,而執行緒排程和管理是在核心態實現的。因此核心級執行緒的上下文切換時間要大於使用者級執行緒的上下文切換時間。