線程管理
- 爲什麼使用線程?
- 什麼是線程?
- 線程的實現?
- 多線程編程接口舉例
1.1 爲什麼使用進程
需要提出一種新的實體,滿足以下特性:
- 實體之間可以併發地執行
- 實體之間共享相同的地址空間
這種實體就是進程。
1.2 什麼是線程
進程當中的一條執行流程。
從兩個方面重新理解進程
- 從資源組合的角度: 進程把一組相關的資源組合起來,構成了一個資源平臺(環境),包括地址空間(代碼段、數據段)、打開文件的各種資源;
- 從運行的角度: 代碼在這個資源平臺上的一條執行流程。
線程 = 進程 - 共享資源
線程的優點:
- 一個進程可以同時存在多個線程
- 各個線程之間可以併發地執行
- 各個線程之間可以共享地址空間和文件等資源
線程的缺點:
- 一個線程崩潰,會導致其所屬進程的所有線程崩潰
chrome一個進程打開一個網頁
線程所佔進程提供的資源中,哪些是線程獨佔的,哪些是線程共享的?
如下圖所示:
代碼段、數據段和文件是共享的,寄存器、堆棧是獨立的。
線程與進程的比較
- 進程是資源分配單位,線蟲是CPU調度的單位
- 進程擁有一個完整的資源平臺,而線程只獨享必不可少的資源,如寄存器和棧
- 線程同樣具有就緒、阻塞和執行三種基本狀態,同樣具有狀態之間的轉換關係
- 進程能減少併發執行的時間和空間開銷
- 線程的創建時間比進程短
- 線程的終止時間比進程短
- 同一進程內的線程切換時間比進程短(屬於同一進程的線蟲具有同一頁表)
- 由於同一進程的各線程之間共享內存和文件資源,可直接進行不通過內核的通信
1.3 線程的實現
主要有三種線程的實現方式
- 用戶線程: 在用戶空間實現(操作系統看不到的,應用程序的庫管理)
- 內核線程: 在內核中實現(操作系統管理的)
- 輕量級進程: 在內核中實現,支持用戶線程
用戶線程與內核線程的對應關係
- 多對一
- 一對一
- 多對多
用戶空間實現的線程機制,它不依賴於操作系統的內核,由一組用戶級的線程庫函數來完成線程的管理,包括線程的創建、終止、同步和調度等。
- 由於用戶線程的維護由相應進程來完成(通過線程庫函數),不需要操作系統內核瞭解用戶線程的存在,可用於不支持線程技術的多進程操作系統
- 每個進程都需要它自己私有的線程控制塊(TCB)列表,用來跟蹤記錄它的各個線程的狀態信息(PC, 棧指針,寄存器),TCB由線程庫函數來維護
- 用戶線程的切換也是由線程庫函數來完成的,無需用戶態/核心態切換,所以速度特別快
- 允許每個進程都有自定義的線程調度算法。
用戶線程缺點
- 如果一個線程發起系統調用而阻塞,則整個進程在等待
- 當一個線程開始運行後,除非他主動交出CPU的使用權,否則它所在的進程當中的其它線程將無法運行
- 由於時間片分配給進程,故與其它進程比,在多線程執行時,每個線程得到時間片較少,執行會比較慢。
內核線程
內核線程指在操作系統的內核當中實現的一種線程機制,由操作系統的內核來完成線程的創建、終止和管理。
- 在支持內核線程的操作系統中,由內核來維護進程和線程的上下文信息(PCB和TCB)
- 線程的創建、終止和切換都是通過系統調用/內核函數的方式來進行,由內核完成,因此係統開銷較大
- 在一個進程當中,如果某個內核線程發起系統調用而阻塞,並不會影響其他內核線程的運行
- 時間片分配給線程,多線程的進程獲得更多CPU的時間
- Windows NT和Windows 2000/XP 支持內核線程
輕量級線程
它是內核支持的用戶進程。一個進程可有一個或多個輕量級進程,每個輕量級進程由一個單獨的內核線程來支持(Solaris / Linux)。