單線程結構進程
•傳統進程是單線程結構進程
單線程結構進程的問題
單線程結構進程在併發程序設計上存在的問題:
• 進程切換開銷大
• 進程通信開銷大
• 限制了進程併發的粒度
• 降低了並行計算的效率
解決問題的思路
• 把進程的兩項功能,即“獨立分配資源”與“被調度分派執行”分離開來
• 進程作爲系統資源分配和保護的獨立單位,不需要頻繁地切換;
• 線程作爲系統調度和分派的基本單位,能輕裝運行,會被頻繁地調度和切換
• 線程的出現會減少進程併發執行所付出的時空開銷,使得併發粒度更細、併發性更好
多線程結構進程
多線程環境下進程的概念
在多線程環境中,進程是操作系統中進行保護和資源分配的獨立單位。具有:
•用來容納進程映像的虛擬地址空間
•對進程、文件和設備的存取保護機制
多線程環境下線程的概念
線程是進程的一條執行路徑,是調度的基本單位,同一個進程中的所有線程共享進程獲得的主存空間和資源。它具有:
• 線程執行狀態
• 受保護的線程上下文,當線程不運行時,用於存儲現場信息
• 獨立的程序指令計數器
• 執行堆棧
• 容納局部變量的靜態存儲器
多線程環境下線程的狀態與調度
線程狀態有運行、就緒和睡眠,無掛起
與線程狀態變化有關的線程操作有:
孵化、封鎖、活化、剝奪、指派、結束
OS感知線程環境下:
處理器調度對象是線程
進程沒有三狀態(或者說只有掛起狀態)
OS不感知線程環境下:
處理器調度對象仍是進程
用戶空間中的用戶調度程序調度線程
併發多線程程序設計的優點
• 快速線程切換
• 減少(系統)管理開銷
•(線程)通信易於實現
• 並行程度提高
• 節省內存空間
多線程技術的應用
• 前臺和後臺工作
• C/S應用模式
• 加快執行速度
• 設計用戶接口
內核級線程KLT, Kernel-Level Threads
線程管理的所有工作由OS內核來做
OS提供了一個應用程序設計接口API,供開發者使用KLT
OS直接調度KLT
內核級線程的特點
• 進程中的一個線程被阻塞了,內核能調度同一進程的其它線程佔有處理器運行
• 多處理器環境中,內核能同時調度同一進程中多個線程並行執行
• 內核自身也可用多線程技術實現,能提高操作系統的執行速度和效率
• 應用程序線程在用戶態運行,線程調度和管理在內核實現,在同一進程中,控制權從一個線程傳送到另一個線程時需要模式切換,系統開銷較大
用戶級線程ULT, User-Level Threads
用戶空間運行的線程庫,提供多線程應用程序的開發和運行支撐環境
任何應用程序均需通過線程庫進行程序設計,再與線程庫連接後運行
線程管理的所有工作都由應用程序完成,內核沒有意識到線程的存在
用戶級線程的特點
• 所有線程管理數據結構均在進程的用戶空間中,線程切換不需要內核模式,能節省模式切換開銷和內核的寶貴資源
• 允許進程按應用特定需要選擇調度算法,甚至根據應用需求裁剪調度算法
• 能運行在任何OS上,內核在支持ULT方面不需要做任何工作
• 不能利用多處理器的優點,OS調度進程,僅有一個ULT能執行
• 一個ULT的阻塞,將引起整個進程的阻塞
Jacketing技術
•把阻塞式系統調用改造成非阻塞式的
•當線程陷入系統調用時,執行jacketing程序
•由jacketing 程序來檢查資源使用情況,以決定是否執行進程切換或傳遞控制權給另一個線程
用戶級線程 vs. 內核級線程
• ULT適用於解決邏輯並行性問題
• KLT適用於解決物理並行性問題
多線程實現的混合式策略
線程創建是完全在用戶空間做的
單應用的多個ULT可以映射成一些KLT,通過調整KLT數目,可以達到較好的並行效果
多線程實現混合式策略的特點
• 組合用戶級線程/內核級線程設施
• 線程創建完全在用戶空間中完成,線程的調度和同步也在應用程序中進行
• 一個應用中的多個用戶級線程被映射到一些(小於等於用戶級線程數目)內核級線程上
• 程序員可以針對特定應用和機器調節內核級線程的數目,以達到整體最佳結果
• 該方法將會結合純粹用戶級線程方法和內核級線程方法的優點,同時減少它們的缺點
線程混合式策略下的線程狀態
• KLT三態,系統調度負責
• ULT三態,用戶調度負責
• 活躍態ULT代表綁定KLT的三態
• 活躍態ULT運行時可激活用戶調度
• 非阻塞系統調用可使用Jacketing啓動用戶調度,調整活躍態ULT
多線程實現的各種策略總結
NUM446
個人博客式公衆號
用心每一天