6.1.2 執行緒上下文
作業系統管理很多程序的執行。有些程序是來自各種程式、系統和應用程式的單獨程序,而某些程序來自被分解為很多程序的應用或程式。當乙個程序從核心中移出,另乙個程序成為活動的,這些程序之間便發生了上下文切換。作業系統必須記錄重啟程序和啟動新程序使之活動所需要的所有資訊。這些資訊被稱作上下文,它描述了程序的現有狀態。當程序成為活動的,它可以繼續從被搶占的位置開始執行。程序的上下文資訊包括:
程序id
指向可執行檔案的指標
棧靜態和動態分配的變數的記憶體
處理器暫存器
程序的上下文的多數資訊都與位址空間的描述有關。程序的上下文使用很多系統資源,而且會花費一些時間來從乙個程序的上下文切換到另乙個程序的上下文。執行緒也有上下文。表6-1將執行緒上下文和第5章討論的程序上下文進行了對比。當執行緒被搶占時,就會發生執行緒之間的上下文切換。如果執行緒屬於相同的程序,它們共享相同的位址空間,因為執行緒包含在它們所屬於的程序的位址空間內。這樣,程序需要恢復的多數資訊對於執行緒而言是不需要的。儘管程序和它的執行緒共享了很多內容,但最為重要的是其位址空間和資源,有些資訊對於執行緒而言是本地且唯一的,而執行緒的其他方面包含在程序的各個段的內部。
表6-1
上下文內容
進 程
線 程
指向可執行檔案的指標x棧
xx記憶體(資料段和堆)x狀態
xx優先順序x
x程式i/o的狀態
x授予許可權
x排程資訊
x審計資訊
x有關資源的資訊
● 檔案描述符
● 讀/寫指標
x有關事件和訊號的資訊
x暫存器組
● 棧指標
● 指令計數器
● 諸如此類xx
對執行緒唯一或本地的資訊包括執行緒id、處理器暫存器(當執行緒執行時暫存器的狀態,包括程式計數器和棧指標)、執行緒狀態及優先順序、執行緒特定資料(thread-specific data,tsd)。執行緒id是在建立執行緒時指定的。執行緒能夠訪問它所屬程序的資料段,因此執行緒可以讀寫它所屬程序的全域性宣告資料。程序中乙個執行緒做出的任何改動都可以被程序中的所有執行緒以及主線程獲得。在多數情況下,這要求某種型別的同步以防止無意的更新。執行緒的區域性宣告變數不應當被任何對等執行緒訪問。它們被放置到執行緒棧中,而且當執行緒完成時,它們便會被從棧中移走。
注意:執行緒間的同步將在第7章中討論。
tsd是一種結構體,包含執行緒私有的資料和資訊。tsd可以包含程序全域性資料的私有副本,還可以包含執行緒的訊號掩碼。訊號掩碼用來識別特定型別的訊號,這些訊號在傳送給程序時不會被該執行緒接收。否則,如果作業系統給程序傳送乙個訊號,程序的位址空間中的所有執行緒也會接收到那個訊號。執行緒會接收所有沒有被掩碼遮蔽的訊號。
執行緒與它所屬的程序共享**段和棧段。它的指令指標指向程序的**段的某個位置,是下一條可執行的執行緒指令,而且棧指標指向程序棧中線程的棧的頂部位置。執行緒還可以訪問任何環境變數。程序的所有資源(例如檔案描述符)都將與執行緒共享。
程序上下文與中斷上下文
處理器總處於以下狀態中的一種 核心態,執行於程序上下文,核心代表程序執行於核心空間。核心態,執行於中斷上下文,核心代表硬體執行於核心空間。使用者態,執行於使用者空間。程序上下文 在linux中,使用者程式裝入系統形成乙個程序的實質是系統為使用者程式提供乙個完整的執行環境。程序的執行環境是由它的程式 ...
程序上下文與中斷上下文
處理器總處於以下狀態中的一種 核心態,執行於程序上下文,核心代表程序執行於核心空間。核心態,執行於中斷上下文,核心代表硬體執行於核心空間。使用者態,執行於使用者空間。程序上下文 在linux中,使用者程式裝入系統形成乙個程序的實質是系統為使用者程式提供乙個完整的執行環境。程序的執行環境是由它的程式 ...
程序上下文與中斷上下文
關於作業系統使用者態與核心態 linux之使用者態和核心態 上下文context 通俗講就是程式執行時周圍的環境 使用者空間的應用程式,通過系統呼叫,陷入核心空間.這個時候使用者空間的程序需要傳遞很多的變數,引數的值給核心,核心態執行時也要儲存使用者程序的一些暫存器值,變數等.所謂的 程序上下文 可...