執行緒控制塊

執行緒控制塊

執行緒控制塊(Thread Control Block,TCB)是與進程的控制塊(PCB)相似的子控制塊,只是TCB中所保存的執行緒狀態比PCB中保存少而已(當然可以說這個定義是淺顯或錯誤的)。

進程控制塊

進程控制塊(Process Control Block,PCB),是作業系統核心中一種數據結構,主要表示進程狀態,它是對系統的進程進行管理的重要依據,和進程管理相關的操作無一不用到PCB中的內容。雖各實際情況不盡相同,PCB通常記載進程之相關信息。

第一種描述

(1)進程狀態:可以是new、ready、running、waiting或halted等。

(2)程式計數器:接著要運行的指令地址。

(3)CPU暫存器:如累加器、索引暫存器(Index Register)、堆疊指針以及一般用途暫存器、狀況代碼等,主要用途在於中斷時暫時存儲數據,以便稍後繼續利用;其數量及類因計算機架構有所差異。

(4)CPU排班法:優先權、排班佇列等指針以及其他參數。

(5)存儲器管理:如分頁表(Page Table)等。

(6)會計信息:如CPU與實際時間之使用數量、時限、帳號、工作或進程號碼。

(7)輸入輸出狀態:配置進程使用I/O設備,如磁帶機。

第二種描述

(1)進程標識符(內部,外部)

(2)處理機的信息:通用暫存器,指令計數器,PSW,用戶的棧指針。

(3)進程調度信息:進程狀態,進程的優先權,進程調度所需的其它信息,事件。

(4)進程控制信息:程式的數據的地址,資源清單,進程同步和通信機制,連結指針。

執行緒與進程

進程是表示資源分配的基本單位,又是調度運行的基本單位。用戶運行自己的程式,系統就創建一個進程,並為它分配各類資源。然後,把該進程放入進程的就緒佇列。進程調度程式選中它,為它分配CPU以及其它有關資源,該進程才真正運行。進程是系統中的並發執行的單位。

執行緒是進程中執行運算的最小單位,即執行處理機調度的基本單位。如果把進程理解為在邏輯上作業系統所完成的任務,那么執行緒表示完成該任務的許多可能的子任務之一。它便於調度和使用。系統在運行的時候會為每個進程分配不同的記憶體區域,但是不會為執行緒分配記憶體(執行緒所使用的資源是它所屬的進程的資源),執行緒組只能共享資源。那就是說,除了執行緒在運行的時候要占用CPU資源外,計算機內部的軟硬體資源的分配與執行緒無關,執行緒只能共享它所屬進程的資源。

至於他們的關係,可以理解為執行緒是進程的一部分。一個執行緒只能屬於一個進程,而一個進程可以有多個執行緒。執行緒是進程的一部分,所以執行緒有的時候被稱為是輕權進程或者輕量級進程。

執行緒控制塊

執行緒控制塊示例模型 執行緒控制塊示例模型

關於執行緒控制塊,很難有一個現成的明顯的定義。對比進程和執行緒的關係,以及進程控制塊的內容和功能,我們暫且將執行緒控制塊理解為進程控制塊的組成和附屬。

現在用下列的圖是來表示:

最終也只能作出這樣的結論了,更多的需要讀者的深層次理解。

Linux的進程塊

該部分用於各讀者提供參考,是原出處對第本文(一)部分的補充

Linux的進程控制塊為一個由結構task_struct所定義的數據結構,task_struct存

/include/ linux/sched.h中,其中包括管理進程所需的各種信息。Linux系統的所有進程控制塊組織成結構數組形式。早期的Linux版本是多可同時運行進程的個數由NR_TASK(預設值為512)規定,NR_TASK即為PCB結果數組的長度。近期版本中的PCB組成一個環形結構,系統中實際存在的進程數由其定義的全局變數nr_task來動態記錄。結構數組:struct task_struct*task[NR_TASK]={∈it_task}來記錄指向各PCB的指針,該指針數組定義於/kernel/sched.c中。

在創建一個新進程時,系統在記憶體中申請一個空的task_struct區,即空閒PCB塊,並填入所需信息。同時將指向該結構的指針填入到task[]數組中。當前處於運行狀態進程的PCB用指針數組current_set[]來指出。這是因為Linux支持多處理機系統,系統內可能存在多個同時運行的進程,故current_set定義成指針數組。

Linux系統的PCB包括很多參數,每個PCB約占1KB多的記憶體空間。

用於表示PCB的結構task_struct簡要描述如下:

struct task_struct{

...

unsigned short uid;

int pid;

int processor;

...

volatile long state;

long prority;

unsighed long rt_prority;

long counter;

unsigned long flags;

unsigned long policy;

...

Struct task_struct *next_task, *prev_task;

Struct task_struct *next_run,*prev_run;

Struct task_struct *p_opptr,*p_pptr,*p_cptr,*pysptr,*p_ptr;

...

};

【對部分數據成員的說明】

(1)unsigned short pid 為用戶標識

(2)int pid 為進程標識

(3)int processor標識用戶正在使用的CPU,以支持對稱多處理機方式;

(4)volatile long state 標識進程的狀態,可為下列六種狀態之一:

可運行狀態(TASK-RUNING);

可中斷阻塞狀態(TASK-UBERRUPTIBLE)

不可中斷阻塞狀態(TASK-UNINTERRUPTIBLE)

僵死狀態(TASK-ZOMBLE)

暫停態(TASK_STOPPED)

交換態(TASK_SWAPPING)

(5)long prority表示進程的優先權

(6)unsigned long rt_prority 表示實時進程的優先權,對於普通進程無效

(7)long counter 為進程動態優先權計數器,用於進程輪轉調度算法

(8)unsigned long policy 表示進程調度策略,其值為下列三種情況之一:

SCHED_OTHER(值為0)對應普通進程優先權輪轉法(round robin)

SCHED_FIFO(值為1)對應實時進程先來先服務算法;

SCHED_RR(值為2)對應實時進程優先權輪轉法

(9)struct task_struct *next_task,*prev_task為進程PCB雙向鍊表的前後項指針

(10)struct task_struct *next_run,*prev_run為就緒佇列雙向鍊表的前後項指針

(11)struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_ptr指明進程家族間的關係,分別為指向祖父進程、父進程、子進程以及新老進程的指針。

相關詞條

相關搜尋

熱門詞條

聯絡我們