1. 程式人生 > >線程的實現方式之內核支持線程和用戶級線程

線程的實現方式之內核支持線程和用戶級線程

自己 資源 images 分類 由於 內核對象 方法 使用 use

  線程是OS進行獨立調試、執行的基本單位,進程是系統進行資源分配的基本單位,一個進程可以包含若幹個線程。無論是系統進程還是用戶進程,進程的創建、撤消、以及要求系統設備完成的IO操作,都是利用系統調用而進入內核,再由內核中相應處理程序予以完成。進程的切換同樣是在內核的支持下實現的。即不論什麽樣的進程,它們都是在OS內核的支持下運行的,是與內核緊密相關的。

1. 線程的分類

  線程根據其實現方式不同又可分為內核支持線程KST(Kernel Supported Threads)、用戶級線程ULT(User Level Threads)、組合方式(ULT/KST)三種方式。

技術分享

1.1 內核支持線程KST

  內核支持線程是駐留在內核空間中的內核對象。用戶進程或者系統進程中的線程的創建、撤消、切換都是在內核空間中實現的,並由內核為其分配線程控制塊進行管理。每個用戶線程會被映射或者綁定到一個內核線程,形成一對一的線程對應關系,如上圖所示,內核可以感知線程的存在,其調度是以線程為基本單位。

  內核支持線程的優點如下:

  • 在多處理器系統中,內核能夠同時調度同一個進程中的多個線程並行執行;
  • 如果進程中一個線程被阻塞了,內核可以調度該進程中的其他線程占有處理器運行,也可以運行其它進程中的線程;
  • 內核本身可以使用多線程技術,以提高系統的執行和效率。

  缺點:

  • 對於用戶級線程切換時,由於用戶進程的線程是在用戶態運行的,需要從用戶態轉到內核態進行,導致切換時開銷較大。

1.2 用戶級線程ULT

  用戶級線程僅存在於用戶空間中,對於這種線程的創建、撤消、線程之間的同步與通信等,無須利用系統調用來實現,也同樣無須內核的運行,而是通過中間系統(線程庫)在用戶空間中來完成。由於不需要用戶/內核態切換,線程切換速度比較快。但由於內核無法感知用戶級線程的存在,其調度仍是以進程為單位進行的。當內核調度一個進程運行時,用戶級線程庫調度該進程的一個線程執行,如果時間片允許,進程的其他線程也可能被執行,該進程的多個線程共享該進程的運行時間片。如果一個線程需要進行i/o讀寫,該線程調用系統調用進入內核,在啟動I/O設備後內核會把該進程值為阻塞態,並把CPU分配給其他進程。即使該進程的其他線程可以運行,內核也不會發現這一情況,在該進程的狀態變為就緒之前內核不會調度該進程運行,因而屬於該進程的線程都不可能運行,因而用戶級線程的並行性會受到一定的限制。用戶級線程是一種"多對一"的線程映。

  用戶級線程的優點:

  • 線程不需要轉換到內核空間。對一個進程而言,其所有線程的管理數據結構均在進程的用戶空間中,管理線程切換的線程庫也在用戶地址空間中運行,節省了切換的開銷和內核資源
  • 調度算法可以是進程專用的。在不幹擾系統調度的情況下,不同的進程可以根據自身的需要,來選擇不同的調度算法對自己的線程進行管理和調度,而與操作系統的低級調度算法無關
  • 用戶級線程實現與OS平臺無關,其屬於用戶程序的一部分,可以在不支持線程機制的操作系統平臺上實現。

  缺點:

  • 系統調用阻塞問題。當線程因系統調用而被阻塞,進程內的所有線程都會阻塞(以進程為調度單位的原因)。
  • 在單純的用戶級線程實現方式中,多線程不能利用多處理進行多重處理的優點。內核每次分配給一個進程僅有一個CPU,進程中只有一個線程可以執行,在該線程放棄CPU之前,其它線程只能等待。

1.3 組合方式

  即將用戶級線程和內核支持線程兩種方式進行組合,在Solaris 中,用戶創建的多個用戶級線程被映射到一些內核線程上(多對多的線程映射),內核線程的數目可能少於用戶級線程的數目,內核級線程的數目決定了該進程的並發度。

2. 線程實現方式

  無論是進程還是線程,都必須直接或者間接取得內核的支持。內核支持線程可以利用系統調用為其服務,線程控制簡單,用戶級線程須借助於某和形式的中間系統來取得內核的服務,做在對線程的控制上稍復雜些。

2.1 內核支持線程的實現

  在僅設置了內核支持線程的OS中,一種可能的線程控制方法是:系統在創建一個新進程時,便為它分配一個任務數據務PTDA(Per Task Data Area),其中包含若幹個線程控制塊TCB空間。在每一個TCB中可保存線程標識符、優先級、線程運行的CPU狀態信息等。雖然這些信息與用戶級線程TCB中的信息相同,但現在卻是被保存在內核空間中。

2.2 用戶線程的實現

  用戶級線程是用戶空間實現的,它們都運行在一個中間系統上,當前有兩種方式實現的中間系統:運行時系統和內核控制線程。

2.2.1 運行時系統(Running System)

  所謂“運行時系統”,實質是用於管理和控制線程的函數集合,包括創建、撤銷、線程的同步和通信的函數以及調度的函數。正因為這些函數,才能使用戶線程與內核無關,所有函數都駐留在用戶空間中,作為用戶線程和內核之間的接口。在進行線程切換時,不需要轉入核心態,而是由運行時系統中的線程切換來執行切換任務。由於用戶線程不能使用系統調用,所以當線程需要系統資源時,將請求傳送給運行時系統,由後者通過相應的系統調用來獲取系統資源。

2.2.2 內核控制線程

  這種線程又稱為輕型進程LWP(Light Weight Process)。每一進程可擁有多個LWP,同用戶級線程一樣,每個LWP都有自己的數據結構(如TCB),其中包括線程標識符、優先級、狀態,另外還有棧和局部存儲區等。它們可以共享進程所擁有的資源。LWP可通過系統調用來獲得內核提供的服務,這樣一個用戶級線程運行時,只要將它們連接到一個LWP上,此時它便具有了內核支持線程的所有屬性,這種線程實現方式就是組合方式

  在一個系統中的用戶線程數量可能很大,為了節省開銷,不可能設置過多的LWP,而把這些LWP做成一個緩沖池,稱為“線程池”。用戶進程中的任一用戶線程都可以連接到LWP池中的任何一個LWP上,為使每一用戶級線程都利用LWP與內核通信,可以使多個用戶級線程多路復用一個LWP,但只有當前連接到LWP上的線程才能與內核通信,其余進程或者阻塞,或者等待LWP。而每一個LWP都要連接到一個內核級線程上,這樣,通過LWP可把用戶級線程與內核線程連接起來,用戶線程可通過LWP來訪問內核,但內核所看到的總是多個LWP而看不到用戶級線程,亦即,由LWP實現了內核與用戶級線程之間的隔離,從而使用戶級線程與內核無關。如下圖所示。

技術分享

  參考:教材《計算機操作系統》第三版 湯子瀛 P77

線程的實現方式之內核支持線程和用戶級線程