複製鏈接
請複製以下鏈接發送給好友

線程控制塊

鎖定
線程控制塊(Thread Control Block,TCB)是與進程的控制塊(PCB)相似的子控制塊,只是TCB中所保存的線程狀態比PCB中保存少而已。
中文名
線程控制塊
外文名
Thread Control Block,TCB
相    似
進程的控制塊
隸    屬
計算機編程

線程控制塊進程控制塊

進程控制塊(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資源外,計算機內部的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。
至於他們的關係,可以理解為線程是進程的一部分。一個線程只能屬於一個進程,而一個進程可以有多個線程。線程是進程的一部分,所以線程有的時候被稱為是輕權進程或者輕量級進程

線程控制塊關於線程控制塊

線程控制塊示例模型 線程控制塊示例模型
關於線程控制塊,很難有一個現成的明顯的定義。對比進程和線程的關係,以及進程控制塊的內容和功能,我們暫且將線程控制塊理解為進程控制塊的組成和附屬。
用下列的圖是來表示: [1] 
最終也只能作出這樣的結論了,更多的需要讀者的深層次理解。

線程控制塊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]={&init_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指明進程家族間的關係,分別為指向祖父進程、父進程、子進程以及新老進程的指針。
參考資料