執行緒詳細剖析(二)
6.1.2 執行緒上下文
作業系統管理很多程序的執行。有些程序是來自各種程式、系統和應用程式的單獨程序,而某些程序來自被分解為很多程序應用或程式。當一個程序從核心中移出,另一個程序成為活動的,這些程序之間便發生了上下文切換。作業系統必須記錄重啟程序和啟動新程序使之活動所需要的所有資訊。這些資訊被稱作上下文,它描述了程序的現有狀態。當程序成為活動的,它可以繼續從被搶佔的位置開始執行。程序的上下文資訊包括
1)程序ID
2)執行可執行檔案的指標
3)棧
4)靜態和動態分配的變數的記憶體
5)處理器暫存器
程序上下文的多數資訊都與地址空間的描述有關。程序的上下文使用很多系統資源,而且會花費一些時間來從一個程序的上下文切換到另一個程序的上下文。執行緒也有上下文,表6-1將執行緒上下文和第5章討論的程序上下文進行了對比。當執行緒被搶佔時,就會發生執行緒之間的上下文切換。如果執行緒屬於相同的程序,它們共享相同的地址空間,因為執行緒包含在它們所屬於的程序的地址空間內。這樣,程序需要恢復的多數資訊對於執行緒而言是不需要的。儘管程序和它的執行緒共享了很多內容,但最為重要的是其地址空間和資源,有些資訊對於執行緒而言時本地且唯一的,而執行緒的其他方面包含在程序的各個段的內部。
對執行緒唯一或本地的資訊包括執行緒ID、處理器暫存器(當執行緒執行時暫存器的狀態,包括程式計數器和棧指標)、執行緒狀態及優先順序、執行緒特定資料(thread-specific data, TSD)。執行緒id是在建立執行緒時指定的。執行緒能夠訪問它所屬程序的資料段,因此執行緒可以讀寫它所屬程序的全域性宣告資料。程序中一個執行緒做出的任何改動都可以被程序中的所有執行緒以及主執行緒獲得。在多少情況下,這要求某種型別的同步以放置無意的更新。執行緒的區域性宣告變數不應當被任何對等執行緒訪問。它們被放置到執行緒棧中,而且當執行緒完成時,它們便會被從棧中移走。
TSD是一種結構體,包含執行緒私有的資料和資訊。TSD可以包含程序全域性資料的私有副本,還可以包含執行緒的訊號掩碼。訊號掩碼用來識別特定型別的訊號,這些訊號在傳送給程序時不會被該執行緒接收。否則,如果作業系統給程序傳送一個訊號,程序的地址空間中的所有執行緒也會接收到那個訊號。執行緒會接收所有沒有被掩碼遮蔽的訊號。
執行緒和它所屬的程序共享程式碼段和棧端。它的指令指標指向程序的程式碼段的某個位置,是下一條可執行的執行緒指令,而且棧指標指向程序棧中執行緒的棧的頂部位置。執行緒還可以訪問任何環境變數。程序的所有資源(例如檔案描述符)都將與執行緒共享。
6.1.3 硬體執行緒和軟體執行緒
執行緒可以在硬體中實現,也可以在軟體中實現。晶片生產廠商實現了有著多個硬體執行緒的核心,用作邏輯核心。有著多個硬體執行緒的核心被稱作同時多執行緒(simultaneous multthread, SMT)核心。SMT將多執行緒的概念引入到硬體中,方法類似與軟體執行緒。支援SMT的處理器在處理器核心中同時執行很多軟體執行緒或程序。讓軟體執行緒同時在單獨的處理器核心總執行,增加了核心的效率,因為類似I/O延遲等因素產生的等待時間被減到最短。作業系統將邏輯核心安裝獨特的處理器核心來對待。它們會要求一些冗餘的硬體來儲存執行緒的上下文資訊,例如指令計數器和暫存器組。根據處理器核心的不同,其他硬體或結構將被複制或在多個執行緒的上下文之間共享。
Sun公司的UltraSparc T1、IBM公司的Cell Broadband Engine(CBE)以及各種Intel多核處理器利用SMT或晶片級多執行緒(chip-level multithreading, CMT),實現了每個核心上2-8個執行緒。超執行緒是 Intel 對SMT的實現,其主要目的就是改善對多執行緒程式碼的支援。超執行緒或SMT技術通過一個處理器核心上並行執行執行緒,在特定負載下提供了對CPU資源的有效使用。
6.1.4 執行緒資源
執行緒將大部分的資源同相同程序中其他執行緒進行共享。執行緒擁有一些定義它們上下文的資源。執行緒必須共享其他資源,例如處理器、記憶體、檔案描述符等。檔案描述符是單獨我每個程序分配的,相同程序中的執行緒將競爭對這些描述符的使用權。執行緒可以分配額外的資源,例如檔案或互斥量,但是程序中所有的執行緒都可以訪問它們。
一個程序能夠消耗的資源是受限制的。因此,對等執行緒擁有的全部資源不夠超過程序的資源限制。如果一個執行緒試圖消耗的資源數量多於定義的軟體資源限制,它會收到一個訊號,被告知達到了程序的資源限制。
當執行緒利用它們的資源時必須很小心,不能夠在它們被取消時將這些資源置於不穩定的狀態。如果終止的執行緒放任檔案處於開啟狀態,可能導致檔案受損,或者當應用程式終止時導致資料丟失。在終止前,執行緒應當執行一些清理工作,防止這些不期望出現的狀況發生。