進(jìn)程標(biāo)志:
- PF_ALIGNWARN 打印“對齊”警告信息。
- PF_PTRACED 被ptrace系統(tǒng)調(diào)用監(jiān)控。
- PF_TRACESYS 正在跟蹤。
- PF_FORKNOEXEC 進(jìn)程剛創(chuàng)建,但還沒執(zhí)行。
- PF_SUPERPRIV 超級用戶特權(quán)。
- PF_DUMPCORE dumped core。
- PF_SIGNALED 進(jìn)程被信號(signal)殺出。
- PF_STARTING 進(jìn)程正被創(chuàng)建。
- PF_EXITING 進(jìn)程開始關(guān)閉。
- PF_USEDFPU 該進(jìn)程使用FPU(SMP only)。
- PF_DTRACE delayed trace (used on m68k)。
(3) long priority;
進(jìn)程優(yōu)先級。 Priority的值給出進(jìn)程每次獲取CPU后可使用的時(shí)間(按jiffies計(jì))。優(yōu)先級可通過系統(tǒng)調(diào)用sys_setpriorty改變(在kernel/sys.c中)。
(4) unsigned long rt_priority;
rt_priority給出實(shí)時(shí)進(jìn)程的優(yōu)先級,rt_priority+1000給出進(jìn)程每次獲取CPU后可使用的時(shí)間(同樣按jiffies計(jì))。實(shí)時(shí)進(jìn)程的優(yōu)先級可通過系統(tǒng)調(diào)用sys_sched_setscheduler()改變(見kernel/sched.c)。
(5) long counter;
在輪轉(zhuǎn)法調(diào)度時(shí)表示進(jìn)程當(dāng)前還可運(yùn)行多久。在進(jìn)程開始運(yùn)行是被賦為priority的值,以后每隔一個(gè)tick(時(shí)鐘中斷)遞減1,減到0時(shí)引起新一輪調(diào)度。重新調(diào)度將從run_queue隊(duì)列選出counter值最大的就緒進(jìn)程并給予CPU使用權(quán),因此counter起到了進(jìn)程的動態(tài)優(yōu)先級的作用(priority則是靜態(tài)優(yōu)先級)。
(6) unsigned long policy;
該進(jìn)程的進(jìn)程調(diào)度策略,可以通過系統(tǒng)調(diào)用sys_sched_setscheduler()更改(見kernel/sched.c)。調(diào)度策略有:
- SCHED_OTHER 0 非實(shí)時(shí)進(jìn)程,基于優(yōu)先權(quán)的輪轉(zhuǎn)法(round robin)。
- SCHED_FIFO 1 實(shí)時(shí)進(jìn)程,用先進(jìn)先出算法。
- SCHED_RR 2 實(shí)時(shí)進(jìn)程,用基于優(yōu)先權(quán)的輪轉(zhuǎn)法。
2. 信號處理 (1) unsigned long signal;
進(jìn)程接收到的信號。每位表示一種信號,共32種。置位有效。
(2) unsigned long blocked;
進(jìn)程所能接受信號的位掩碼。置位表示屏蔽,復(fù)位表示不屏蔽。
(3) struct signal_struct *sig;
因?yàn)閟ignal和blocked都是32位的變量,Linux最多只能接受32種信號。對每種信號,各進(jìn)程可以由PCB的sig屬性選擇使用自定義的處理函數(shù),或是系統(tǒng)的缺省處理函數(shù)。指派各種信息處理函數(shù)的結(jié)構(gòu)定義在include/linux/sched.h中。對信號的檢查安排在系統(tǒng)調(diào)用結(jié)束后,以及“慢速型”中斷服務(wù)程序結(jié)束后(IRQ#_interrupt(),參見Array。5節(jié)“啟動內(nèi)核”)。
3. 進(jìn)程隊(duì)列指針 (1) struct task_struct *next_task,*prev_task;
所有進(jìn)程(以PCB的形式)組成一個(gè)雙向鏈表。next_task和就是鏈表的前后指針。鏈表的頭和尾都是init_task(即0號進(jìn)程)。
(2) struct task_struct *next_run,*prev_run;
由正在運(yùn)行或是可以運(yùn)行的,其進(jìn)程狀態(tài)均為TASK_RUNNING的進(jìn)程所組成的一個(gè)雙向循環(huán)鏈表,即run_queue就緒隊(duì)列。該鏈表的前后向指針用next_run和prev_run,鏈表的頭和尾都是init_task(即0號進(jìn)程)。
(3) struct task_struct *p_opptr,*p_pptr;和struct task_struct *p_cptr,*p_ysptr,*p_osptr; 以上分別是指向原始父進(jìn)程(original parent)、父進(jìn)程(parent)、子進(jìn)程(youngest child)及新老兄弟進(jìn)程(younger sibling,older sibling)的指針。 4. 進(jìn)程標(biāo)識 (1) unsigned short uid,gid;
uid和gid是運(yùn)行進(jìn)程的用戶標(biāo)識和用戶組標(biāo)識。
(2) int groups[NGROUPS];
與多數(shù)現(xiàn)代UNIX操作系統(tǒng)一樣,Linux允許進(jìn)程同時(shí)擁有一組用戶組號。在進(jìn)程訪問文件時(shí),這些組號可用于合法性檢查。
(3) unsigned short euid,egid;
euid和egid又稱為有效的uid和gid。出于系統(tǒng)安全的權(quán)限的考慮,運(yùn)行程序時(shí)要檢查euid和egid的合法性。通常,uid等于euid,gid等于egid。有時(shí)候,系統(tǒng)會賦予一般用戶暫時(shí)擁有root的uid和gid(作為用戶進(jìn)程的euid和egid),以便于進(jìn)行運(yùn)作。
(4) unsigned short fsuid,fsgid;
fsuid和fsgid稱為文件系統(tǒng)的uid和gid,用于文件系統(tǒng)操作時(shí)的合法性檢查,是Linux獨(dú)特的標(biāo)識類型。它們一般分別和euid和egid一致,但在NFS文件系統(tǒng)中NFS服務(wù)器需要作為一個(gè)特殊的進(jìn)程訪問文件,這時(shí)只修改客戶進(jìn)程的fsuid和fsgid。
(5) unsigned short suid,sgid;
suid和sgid是根據(jù)POSIX標(biāo)準(zhǔn)引入的,在系統(tǒng)調(diào)用改變uid和gid時(shí),用于保留真正的uid和gid。
(6) int pid,pgrp,session;
評論