天天看點

計算機作業系統之線程(四)

1.線程的定義

在講述線程的定義之前,我們要了解 為什莫要産生線程?

線程的産生 是為了進一步提高 系統的并發性。其主要原因是為了節約作業系統額外的開銷。

程序的引入可以實作并行計算,線程的引入可以進一步提高系統的并發性。一個程序可以擁有多個線程,這些線程共享同一位址空間,他不擁有系統資源,且隻需要很少在運作時必不可少的硬體,是以線程在建立,撤銷,切換等環節所需要的時空開銷比程序要少的多。

2.線程和程序的比較

2.1排程分派:線程作為排程和分派的基本機關,而程序作為資源擁有的基本機關。同一程序中,線程的切換不會引起程序的切換,但從一個程序中的線程切換到另外一個程序中的線程時,将會引起程序切換。

2.2 資源擁有:線程一般不擁有資源(除少量必不可少的系統資源),但它可以通路其隸屬的程序的資源,即一個程序的代碼段,資料段以及擁有的系統資源,如已打開的檔案、I/O裝置等。

2.3位址空間:不同程序的位址空間是互相獨立的,同一程序的各線程共享同一位址空間。一個程序可以擁有多個線程,反過來不行。

2.4通信關系:程序間的通信需要使用系統的通信機制,同一程序中的各線程可以通過直接讀寫資料段(如全局變量)來進行通信。

2.5系統開銷:在建立和撤銷程序時,系統都要為之建立和回收程序控制塊,配置設定或回收資源,作業系統付出的開銷明顯大于線程建立或撤銷時的開銷,在程序切換時,涉及到目前程序CPU環境的儲存和新被排程運作程序的CPU環境的設定,而線程的切換則僅需儲存和設定少量寄存器内容,不涉及存儲器管理方面的操作,是以線程的切換開銷遠小于程序切換開銷,以外,由于一個程序中的多個線程具有相同的位址空間,在同步和通信的實作上也比較容易,在一些作業系統中,線程的切換,同步和通信都無需作業系統核心的幹預。

3.線程的屬性

3.1輕型實體,每個線程都具有一個用于控制線程運作的線程控制塊TCB,用于訓示被執行指令序列的程式計數器,保留局部變量,少量狀态參數合傳回位址等。

3.2 獨立排程和分派的基本機關,線程是能獨立運作的基本機關,切換非常迅速且開銷小。

3.3可并發執行,一個程序、不同程序的線程均可并發執行。

3.4 共享程序資源,同一程序中的線程共享該程序所擁有的資源,所有線程擁有相同的位址空間(程序的位址空間),這意味着線程可以通路該位址空間中的每一個虛位址,此外,還可以通路程序所擁有的已打開檔案,定時器,信号量機構等。

4.線程的狀态

4.1 狀态參數:每一個線程可利用線程辨別符和一組狀态參數進行描述。狀态參數包括寄存器狀态(包括程式計數器和堆棧指針中的内容)、堆棧(儲存的局部變量和傳回位址)、線程運作狀态、優先級、線程專有存儲器(儲存線程自己的具有變量拷貝)、信号屏蔽(對某些資訊加以屏蔽)。

4.2線程運作狀态:運作狀态包括就緒狀态、執行狀态、阻塞狀态。注意:線程一般沒有挂起狀态。而且線程共享該存在的程序的狀态。

5.線程的操作

5.1派生(SPawn)

在建立新線程時,需要利用一個線程建立函數(或系統調用),并根據相應的參數,如指向線程主程式的入口指針、堆棧的大小、排程的優先級等。線上程建立函數執行完後,将傳回一個線程辨別符供以後使用。

5.2阻塞(Block) 5.3解除阻塞(Unblock)

5.4結束(Finish)

結束線程的方式有兩種,線程完成工作後自願退出或者線程在運作中出現錯誤或由于某種原因而被其他線程強行終止。在大多數OS中,線程被終止後并不立即釋放它所占有的資源,隻有當程序中的其他線程執行了分離函數後,被終止的線程才與資源分離,此時的資源才能被其他線程利用。雖然已被終止但尚未釋放資源的線程,仍可以被需要它的線程所調用,以使被終止線程重新恢複運作。

6.線程的控制(同步、通信)

6.1互斥鎖:互斥鎖是一種比較簡單的、用于實作線程間對資源互斥通路的機制。由于操作互斥鎖的時間和空間開銷較低,因為較适合高頻度使用的關鍵共享資料和程式段。

6.2條件變量:建立一個互斥鎖時便聯系着一個條件變量,單純的互斥鎖用于短期鎖定,主要用來保證對臨界區的互斥進入,條件變量則用于線程的長期等待,直至所等待的資源成為可用的資源。

6.4 計數信号量機制:包括私有信号量(同一程序的不同線程需要同步時,可調用建立信号量的指令來建立私有信号量,其資料結構存放在應用程式的位址空間中,私有信号量屬于特定的程序所有,OS并不知道私有信号量的存在,當發生私有信号量的占用者異常或正常結束,但并未釋放私有信号量所占有的空間的情況時,系統将無法使它恢複為0,也不能将它傳送到下一個請求它的線程),公用信号量(其實作不同程序間或不同程序中各線程之間的同步而設定,由所有程序使用,其資料結構放在手保護的系統存儲區中,由OS為它配置設定空間并進行管理,也稱為系統信号量,OS會自動回收其空間,其是一種比較安全的同步機制)

7.線程的類型

7.1核心支援線程

定義:在核心的支援下運作的,即無論是使用者程序中的線程,還是系統程序中的線程,他們的建立、撤銷和切換等,是依靠核心實作的。此處,在核心空間還為每一個線程設定了一個線程控制塊,核心是根據該控制塊而感覺線程的存在的,并對其加以控制。

實作原理:系統在建立一個新程序時,便為它配置設定一個任務資料區PTAD(Per Task Data Area),其中包括若幹個線程控制塊TCB空間,其儲存在核心空間中。當程序要建立一個新線程時,便為其配置設定一個TCB,填入相關的資訊,配置設定必要的資源,于是新建立的線程便有機會執行。當PTAD中的所有TCB配置設定完後,程序又要建立新的線程時,隻要其所建立的線程數量未超過系統的允許值是,系統可再為之配置設定新的TCB空間。在撤銷一個線程時,也回收該線程的所有資源和TCB,有的系統為了減少建立和撤銷一個線程時的開銷,在撤銷一個線程時,并不立即回收該線程的資源和TCB,當以後要建立一個新線程時,便可利用已被撤銷但仍保持有資源和TCB的線程作為新線程。

7.2使用者級線程的實作

定義:此線程僅存在于使用者空間中,對于這種線程的建立、撤銷、線程之間的同步與通信等功能,都無須利用系統調用來實作。對于使用者級線程的切換,通常是發生在一個應用程序的諸多線程之間,這時,也同樣無須核心的支援。切換規則簡單且快。

值得說明的是:對于設定了使用者級線程的系統,其排程是以程序為機關的。是以在采用輪轉排程算法時,各個程序輪流執行一個時間片,這對諸程序而言,看似公平, 其實不然。對于程序中的線程是不公平的,一個程序A有一個使用者級線程,而另一個程序B有100個線程,是以A中的線程的運作時間,是B程序中的各線程運作時間的100倍

實作原理:使用者級線程是在使用者空間實作的,所有的使用者級線程都具有相同的結構,他們都運作在一個中間系統上面,目前有兩種方式實作中間系統,即運作時系統和核心控制線程。

運作時系統是用于管理和控制線程的函數(過程)的集合,其中包括用于建立和撤銷線程的函數、線程同步和通信的函數以及實作線程排程的函數等,正因為有了這些函數,才使得使用者級線程與核心無關,運作時系統中的所有函數都駐留在使用者空間,并作為使用者級線程與核心之間的接口。使用者級線程在切換時不需要轉入核心态,而是由運作時系統中的線程切換過程來執行切換任務。

核心控制線程又稱為輕型程序LWP(Light Weight Process),每一個程序都可擁有多個LWP,同使用者級線程一樣,每個LWP都有自己的資料結構(如TCB),其中包括線程辨別符,優先級,狀态、棧、局部存儲區等。它們也可以享受程序所擁有的資源,LWP可通過系統調用來獲得核心提供的服務,當一個使用者級線程運作時,隻要将它連接配接到一個LWP上,此時它便具有了核心提供支援線程的所有屬性,這種線程實作方式就是組合方式。LWP會做成一個緩沖池,使用者級線程都可以連接配接到任何一個LWP上,為了使每一使用者級線程都能利用LWP與核心通信,可以使多個使用者級線程多路複用一個LWP,但隻有目前連接配接到LWP上的線程才能與核心通信,其餘程序或者阻塞,或者等待LWP,每一個LWP也需要連接配接到一個核心級線程上,這樣,通過LWP可把使用者級線程與核心線程連接配接起來,使用者級線程可通過LWP來通路核心,核心看不到使用者級線程,LWP實作了核心與使用者級線程的隔離。

7.3 使用者線程和核心線程的對應關系

7.3.1. 一對一模型:為每一個使用者線程都設定一個核心控制線程與之連接配接,當一個線程阻塞時,允許排程另一個線程運作,在多處理機系統中,則有多個線程并行執行。

7.3.2. 多對一模型:将多個使用者線程映射到一個核心控制線程,為了管理友善,這些使用者線程一般屬于一個程序,運作在該程序的使用者空間,對這些線程的排程和管理也是在該程序的使用者空間完成的,當使用者線程需要通路核心時,才将其映射到一個核心控制線程上,但每次隻允許一個線程進行映射。 線程管理開銷小,效率高,但當一個線程在通路核心時發生阻塞,則整個程序都會被阻塞,并且在多處理機系統中,一個程序的多個線程無法實作并行。

7.3.3. 多對多模型:将多個使用者線程映射到多個核心控制線程,核心控制線程的數目可以根據應用程序和系統的不同而變化。

注意:當既允許多對多模型也允許一個使用者線程綁定到核心線程,稱為二級模型。

8.線程中的一些注意點:

1.java的thread.join();等待子線程結束。

2.多線程一起完成任務時,如果一個線程已經完成了目标,則其他線程可以被取消;或者當使用者想要取消線程時,則會被取消。要取消的線程為目标線程。

3.異步取消:立即終止。延遲取消:每次取消之前都要檢視是否應該被取消。(這個好)

4.信号由特定事件發生,并且信号隻能被處理一次。信号是由核心或程序發送的。信号是程序間通信的一種方式,一個特定的信号是一個整數。

5.當單線程時,隻要把信号發送給程序。不用考慮選擇哪個線程發送。

當多線程時,需要考慮發給每個線程還是産生事件的線程,還是一個規定接受信号的線程。

6.同步信号:信号發送給産生信号的程序。信号發送給特定的産生信号的線程。

異步信号:發送給其他程序不相關的程序。比如終止程序。

對于信号處理,可以按照預設信号處理程式,也可以按照使用者特定信号處理程式。

繼續閱讀