挑戰408——操作系統(6)——線程詳解

20世紀80年代,人們提出了比進程更小,並能獨立運行的基本單位——線程。如果說進程的目的是爲了讓多個程序彼此之間能夠併發執行,那麼引入線程就是爲了減少併發執行所付出的時間和空間開銷。從而使得操作系統具有更好的併發性。

線程的作用

由於進程是一個資源的擁有者,因此在進程的創建,撤銷以及狀態轉換中都要付出巨大的時間和空間開銷。因此係統中的進程都不宜過多(打開你們的任務管理器,運行的進程都能數出來),因爲我們的主存空間是有限的。但這樣就很明顯的限制了併發程度的提高,因爲可以運行的道數少了。
先回顧一下進程的兩個基本屬性

  1. 能擁有資源
  2. 可以獨立調度和分派的單位

若把這兩個屬性分開,那麼進程不再作爲調度和分派的單位,將這一功能交給其他單位去完成,這個單位就是線程。線程是進程的一個實體同一個進程內可以訪問進程內部的所有資源(但不包括指向下一個進程的棧指針,因爲它對線程透明)。而且線程中的通信比進程中的通信方便的多。
在這裏插入圖片描述
假設用方框表示進程,曲線表示線程,那麼上面的三個圖分別表示,單進程單線程,單進程多線程,多進程多線程。

線程與進程之間的區別與聯繫

類似於進程,每個進程都有一個線程控制塊(TCB),用於保存自己私有信息。而且線程的狀態,及其控制跟進程一樣。但是儘管如此相似,但是還是有所區別的。

  1. 一個進程至少擁有一個線程,進程可以根據需要創建其他進程,也可以創建若干個線程。而線程雖然可以創建其他線程,但是不能創建進程。
  2. 進程是個擁有資源的獨立單位,而線程本身基本不擁有資源(只含有必不可少的資源,比如TCB和棧)。
  3. 在通信方面進程中所有的線程共享該進程的所有資源在通信方面進程中所有的線程共享該進程的所有資源,並駐留在同一地址空間,訪問相同的數據。但是進程只能通過同步,互斥來實現對共享資源的訪問
  4. 從調度的角度,在引入線程的操作系統中,線程是調度和分派的基本單位,進程是資源分配的基本單位。在同一個進程中,線程的切換不會引起進程的切換,只有在進程中一個線程切換到另一個進程的線程中的時候,纔會引起進程的切換。
  5. 從系統開銷來說。在創建和撤銷進程的時候,操作系統所付出的時間和空間開銷將遠遠大於重建或者撤銷線程的開銷

線程的實現

我們知道,對於進程而言,無論是系統進程還是用戶進程,只要涉及進程的切換,在切換過程中都要依賴內核的進程調度程序。但是在線程中,這就不一定了。我們將線程的實現分爲用戶級線程內核級線程

用戶級線程

下圖表示用戶級線程的實現方式:
在這裏插入圖片描述
在純粹實現用戶級線程的軟件中,有關線程管理的所有工作都由應用程序完成,應用程序和它所有的線程被分配到一個由內核管理的進程中,對於用戶級進程,一個進程內線程的行爲不會影響其他進程,內核只是對進程進行適當的調度。

內核級線程

在這裏插入圖片描述
在僅有內核級線程的操作系統中,有關線程管理的所有工作都由內核完成,應用程序要想使用線程,只有通過內核提供的API系統的調度是基於線程的,也就是說,處理機的切換是以線程爲單位進行的(所以線程是可以獨立運行的)。事實上,在內核級系統中,進程是資源的擁有者,線程是作爲調度的基本單位,每個進程至少有一個線程。

兩者的區別

  1. 從切換速度來看,顯然用戶級線程的速度快,因爲它不需要進入操作系統內核
  2. 當某一線程,用戶級線程阻塞,那麼對應的內核級線程也阻塞,其他可以併發執行的線程也必須阻塞(因爲他們不能進入內核的那個進程中)。但是內核級線程卻不受此影響。

多線程的問題

問題一: 如何對多個線程進行取消?
答:多個線程執行同一個任務,其中一個線程任務完成,那麼剩餘的進程就應該取消(比如多個線程查找某個文件或者數字)。線程的取消是指在完成任務之前終止,分爲立即取消和延遲取消兩種
問題二:如果每一個請求,便創建一個線程,那麼請求過多的時候,有限的系統資源就會被耗盡,那麼如何解決這一問題?
答:可以採用線程池的思想解決:

  1. 進程一開始時,創建一定量的線程,放入池中等待
  2. 收到請求後,喚醒其中的一個線程,並將要處理的請求傳遞給它。
  3. 線程完成任務返回池中等待
  4. 若沒有可用線程,那麼服務器等待,直到出現空閒線程爲止

(學過數據庫的同學應該知道,連接池的思想正是如此)

多線程模型

多線程模型是即實現用戶級線程,又實現內核級線程的一種連接方式。(0因此該模型一定同時支持用戶級線程和內核級線程)。也稱組合方式
在這裏插入圖片描述
(1) 多對一模型:這個模型實際上就是用戶級模型,多個用戶級映射到一個內核級線程,用戶級線程對操作系統是透明的。(也就是說當某個線程阻塞了,內核只是知道阻塞了,卻不清楚具體的情況。它只是負責調用)。顯然它存在一個線程阻塞,其他線程都阻塞的風險。
(2)一對一模型:將每個用戶級線程映射到一個內核級線程。這樣雖然確保了進程之間不會相互影響,但是創建的線程開銷很大。
(3)多對多模型:將n個用戶映射到m個內核級線程上(m<=n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章