### 線程的基本概念
引入進程的目的,是為了使多道程序并發執行,以提高資源利用率和系統吞吐量;而引入線程,則是為了減小程序在并發執行時所付出的時空開銷,提高操作系統的并發性能。
線程最直接的理解就是“輕量級進程”,它是一個基本的CPU執行單元,也是程序執行流的最小單元,由線程ID、程序計數器、寄存器集合和堆棧組成。線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。一個線程可以創建和撤銷另一個線程,同一進程中的多個線程之間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。
引入線程后,進程的內涵發生了改變,進程只作為除CPU以外系統資源的分配單元,線程則作為處理機的分配單元。
###線程與進程的比較
1) 調度。在傳統的操作系統中,擁有資源和獨立調度的基本單位都是進程。在引入線程的操作系統中,線程是獨立調度的基本單位,進程是資源擁有的基本單位。在同一進程中,線程的切換不會引起進程切換。在不同進程中進行線程切換,如從一個進程內的線程切換到另一個進程中的線程時,會引起進程切換。
2) 擁有資源。不論是傳統操作系統還是設有線程的操作系統,進程都是擁有資源的基本單位,而線程不擁有系統資源(也有一點必不可少的資源),但線程可以訪問其隸屬進程的系統資源。
3) 并發性。在引入線程的操作系統中,不僅進程之間可以并發執行,而且多個線程之間也可以并發執行,從而使操作系統具有更好的并發性,提高了系統的吞吐量。
4) 系統開銷。由于創建或撤銷進程時,系統都要為之分配或回收資源,如內存空間、 I/O設備等,因此操作系統所付出的開銷遠大于創建或撤銷線程時的開銷。類似地,在進行進程切換時,涉及當前執行進程CPU環境的保存及新調度到進程CPU環境的設置,而線程切換時只需保存和設置少量寄存器內容,開銷很小。此外,由于同一進程內的多個線程共享進程的地址空間,因此,這些線程之間的同步與通信非常容易實現,甚至無需操作系統的干預。
5) 地址空間和其他資源(如打開的文件):進程的地址空間之間互相獨立,同一進程的各線程間共享進程的資源,某進程內的線程對于其他進程不可見。
6) 通信方面:進程間通信(IPC)需要進程同步和互斥手段的輔助,以保證數據的一致性,而線程間可以直接讀/寫進程數據段(如全局變量)來進行通信。
###線程的屬性
在多線程操作系統中,把線程作為獨立運行(或調度)的基本單位,此時的進程,已不再是一個基本的可執行實體。但進程仍具有與執行相關的狀態,所謂進程處于“執行”狀態,實際上是指該進程中某線程正在執行。線程的主要屬性如下:
線程是一個輕型實體,它不擁有系統資源,但每個線程都應有一個唯一的標識符和一個線程控制塊,線程控制塊記錄了線程執行的寄存器和棧等現場狀態。
不同的線程可以執行相同的程序,即同一個服務程序被不同的用戶調用時,操作系統為它們創建成不同的線程。
同一進程中的各個線程共享該進程所擁有的資源。
線程是處理機的獨立調度單位,多個線程是可以并發執行的。在單CPU的計算機系統中,各線程可交替地占用CPU;在多CPU的計算機系統中,各線程可同時占用不同的CPU,若各個CPU同時為一個進程內的各線程服務則可縮短進程的處理時間。
—個線程被創建后便開始了它的生命周期,直至終止,線程在生命周期內會經歷阻塞態、就緒態和運行態等各種狀態變化。
線程的實現方式
線程的實現可以分為兩類:用戶級線程(User-LevelThread, ULT)和內核級線程(Kemel-LevelThread, KLT)。內核級線程又稱為內核支持的線程。
在用戶級線程中,有關線程管理的所有工作都由應用程序完成,內核意識不到線程的存在。應用程序可以通過使用線程庫設計成多線程程序。通常,應用程序從單線程起始,在該線程中開始運行,在其運行的任何時刻,可以通過調用線程庫中的派生例程創建一個在相同進程中運行的新線程。圖2-2(a)說明了用戶級線程的實現方式。
在內核級線程中,線程管理的所有工作由內核完成,應用程序沒有進行線程管理的代碼,只有一個到內核級線程的編程接口。內核為進程及其內部的每個線程維護上下文信息,調度也是在內核基于線程架構的基礎上完成。圖2-2(b)說明了內核級線程的實現方式。
在一些系統中,使用組合方式的多線程實現。線程創建完全在用戶空間中完成,線程的調度和同步也在應用程序中進行。一個應用程序中的多個用戶級線程被映射到一些(小于或等于用戶級線程的數目)內核級線程上。圖2-2(c)說明了用戶級與內核級的組合實現方式。

圖2-2用戶級和內核級線程
###多線程模型
有些系統同時支持用戶線程和內核線程由此產生了不同的多線程模型,即實現用戶級線程和內核級線程的連接方式。
1) 多對一模型
將多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成。
此模式中,用戶級線程對操作系統不可見(即透明)。
優點:線程管理是在用戶空間進行的,因而效率比較高。
缺點:當一個線程在使用內核服務時被阻塞,那么整個進程都會被阻塞;多個線程不能并行地運行在多處理機上。
2) 一對一模型
將每個用戶級線程映射到一個內核級線程。
優點:當一個線程被阻塞后,允許另一個線程繼續執行,所以并發能力較強。
缺點:每創建一個用戶級線程都需要創建一個內核級線程與其對應,這樣創建線程的開銷比較大,會影響到應用程序的性能。
3) 多對多模型
將 n 個用戶級線程映射到 m 個內核級線程上,要求 m <= n。
特點:在多對一模型和一對一模型中取了個折中,克服了多對一模型的并發度不高的缺點,又克服了一對一模型的一個用戶進程占用太多內核級線程,開銷太大的缺點。又擁有多對一模型和一對一模型各自的優點,可謂集兩者之所長。
- 1. 操作系統概述
- 2.操作系統(計算機)進程和線程管理
- 2.1 進程的概念和特征
- 2.2 進程的狀態與轉換
- 2.3 進程控制
- 2.4 進程的組
- 2.5 進程的通信
- 2.6 線程的概念和多線程模型
- 2.7 處理機調度
- 2.8 操作系統典型調度算法
- 2.9 進程同步的基本概念
- 2.10 實現臨界區互斥的基本方法
- 2.11 信號量
- 2.12 管程:管程的定義、組成及基本特性
- 2.13 經典進程同步問題1
- 2.14 經典進程同步問題2:讀者-寫者問題
- 2.15經典進程同步問題3:哲學家進餐問題
- 2.16 經典進程同步問題4:吸煙者問題
- 2.17 死鎖的概念以及產生死鎖的原因
- 2.18 關于進程和線程的知識點匯總