進程控制塊
進程控制塊(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指明進程家族間的關係,分別為指向祖父進程、父進程、子進程以及新老進程的指針。