NO IMAGE

 

PCB(process control block),程序控制塊,是我們學習作業系統後遇到的第一個資料結構描述,它是對系統的程序進行管理的重要依據,和程序管理相關的操作無一不用到PCB中的內容。一般情況下,PCB中包含以下內容:

(1)程序識別符號(內部,外部)
(2)處理機的資訊(通用暫存器,指令計數器,PSW,使用者的棧指標)。
(3)程序排程資訊(程序狀態,程序的優先順序,程序排程所需的其它資訊,事件)
(4)程序控制資訊(程式的資料的地址,資源清單,程序同步和通訊機制,連結指標)

    資料結構中定義的內容是為後面的管理提供支援的,所以不同的作業系統根據自己的特點又對PCB的內容做了一些調整。下面整理了比較流行的一些作業系統的PCB結構,供參考。

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指明程序家族間的關係,分別為指向祖父程序、父程序、子程序以及新老程序的指標。

2.Unix的程序塊(教科書10.2節有詳細介紹)

在 UNIX 系統Ⅴ中, 把程序控制塊分為四部分:
   程序表項

      程序識別符號(PID)

      使用者識別符號(UID)

      程序狀態

      事件描述符

      程序和U區在記憶體或外存的地址

      軟中斷資訊

      計時域

      程序的大小

      偏置值nice

      P-Link指標

      指向U區程序正文、資料及棧在記憶體區域的指標

    U 區  

      程序表項指標

      真正使用者識別符號u-ruid(real user ID)

      有效使用者識別符號u-euid(effective user ID)

      使用者檔案描述符表

      當前目錄和當前根

      計時器

      內部I/O引數

      限制欄位

      差錯欄位

      返回值

      訊號處理陣列

 程序區表

      區的型別和大小

      區的狀態

      區在物理儲存器中的位置

      引用計數

      指向檔案索引結點的指標

系統區表
程序區表項、系統區表項和區的關係
程序的資料結構
程序狀態與程序映像  
   程序狀態

3.windows下的PCB

        按照MS的定義, Windows中的程序簡單地說就是一個記憶體中的可執行程式, 提供程式執行的各種資源. 程序擁有虛擬的地址空間, 可執行程式碼, 資料, 物件控制代碼集, 環境變數, 基礎優先順序, 以及最大最小工作集.

       Windows中的執行緒是系統處理機排程的基本單位. 執行緒可以執行程序中的任意程式碼, 包括正在被其他執行緒執行的程式碼. 程序中的所有執行緒共享程序的虛擬地址空間和系統資源. 每個執行緒擁有自己的例外處理過程, 一個排程優先順序以及執行緒上下文資料結構. 執行緒上下文資料結構包含暫存器值, 核心堆疊, 使用者堆疊和執行緒環境塊.

        Windows中的程序控制塊是EPROCESS結構, 執行緒控制塊是ETHREAD結構. EPROCESS/ETHREAD的定義在inside windows2000中有比較詳細的描述。

        Windows的程序連結串列是一個雙向環連結串列。這個環連結串列LIST_ENTRY結構把每個EPROCESS連結起來. 那麼只要找到一個EPROCESS結構, 我們就可以遍歷整個連結串列, 這就是列舉程序的原理。

建議:同學看看<<Windows核心程式設計>>這本書,對大家進行高階程式設計有很大的幫助