4. 進程標識
(1) unsigned short uid,gid;
uid和gid是運行進程的用戶標識和用戶組標識。
(2) int groups[NGROUPS];
與多數現代UNIX操作系統一樣,Linux允許進程同時擁有一組用戶組號。在進程訪問文件時,這些組號可用於合法性檢查。
(3) unsigned short euid,egid;
euid和egid又稱爲有效的uid和gid。出於系統安全的權限的考慮,運行程序時要檢查euid和egid的合法性。通常,uid等於euid,gid等於egid。有時候,系統會賦予一般用戶暫時擁有root的uid和gid(作爲用戶進程的euid和egid),以便於進行運作。
(4) unsigned short fsuid,fsgid;
fsuid和fsgid稱爲文件系統的uid和gid,用於文件系統操作時的合法性檢查,是Linux獨特的標識類型。它們一般分別和euid和egid一致,但在NFS文件系統中NFS服務器需要作爲一個特殊的進程訪問文件,這時只修改客戶進程的fsuid和fsgid。
(5) unsigned short suid,sgid;
suid和sgid是根據POSIX標準引入的,在系統調用改變uid和gid時,用於保留真正的uid和gid。
(6) int pid,pgrp,session;
進程標識號、進程的組織號及session標識號,相關係統調用(見程序kernel/sys.c)有sys_setpgid、sys_getpgid、sys_setpgrp、sys_getpgrp、sys_getsid及sys_setsid幾種。
(7) int leader;
是否是session的主管,布爾量。
5. 時間數據成員
(1) unsigned long timeout;
用於軟件定時,指出進程間隔多久被重新喚醒。採用tick爲單位。
(2) unsigned long it_real_value,it_real_iner;
用於itimer(interval timer)軟件定時。採用jiffies爲單位,每個tick使it_real_value減到0時向進程發信號SIGALRM,並重新置初值。初值由it_real_incr保存。具體代碼見kernel/itimer.c中的函數it_real_fn()。
(3) struct timer_list real_timer;
一種定時器結構(Linux共有兩種定時器結構,另一種稱作old_timer)。數據結構的定義在include/linux/timer.h中,相關操作函數見kernel/sched.c中add_timer()和del_timer()等。
(4) unsigned long it_virt_value,it_virt_incr;
關於進程用戶態執行時間的itimer軟件定時。採用jiffies爲單位。進程在用戶態運行時,每個tick使it_virt_value減1,減到0時向進程發信號SIGVTALRM,並重新置初值。初值由it_virt_incr保存。具體代碼見kernel/sched.c中的函數do_it_virt()。
(5) unsigned long it_prof_value,it_prof_incr;
同樣是itimer軟件定時。採用jiffies爲單位。不管進程在用戶態或內核態運行,每個tick使it_prof_value減1,減到0時向進程發信號SIGPROF,並重新置初值。初值由it_prof_incr保存。 具體代碼見kernel/sched.c中的函數do_it_prof。
(6) long utime,stime,cutime,cstime,start_time;
以上分別爲進程在用戶態的運行時間、進程在內核態的運行時間、所有層次子進程在用戶態的運行時間總和、所有層次子進程在覈心態的運行時間總和,以及創建該進程的時間。
10. 頁面管理
(1) int swappable:1;
進程佔用的內存頁面是否可換出。swappable爲1表示可換出。對該標誌的復位和置位均在do_fork()函數中執行(見kerenl/fork.c)。
(2) unsigned long swap_address;
虛存地址比swap_address低的進程頁面,以前已經換出或已換出過,進程下一次可換出的頁面自swap_address開始。參見swap_out_process()和swap_out_pmd()(見mm/vmscan.c)。
(3) unsigned long min_flt,maj_flt;
該進程累計的minor缺頁次數和major缺頁次數。maj_flt基本與min_flt相同,但計數的範圍比後者廣(參見fs/buffer.c和mm/page_alloc.c)。min_flt只在do_no_page()、do_wp_page()裏(見mm/memory.c)計數新增的可以寫操作的頁面。
(4) unsigned long nswap;
該進程累計換出的頁面數。
(5) unsigned long cmin_flt,cmaj_flt,cnswap;
以本進程作爲祖先的所有層次子進程的累計換入頁面、換出頁面計數。
(6) unsigned long old_maj_flt,dec_flt;
(7) unsigned long swap_cnt;下一次信號最多可換出的頁數。
11. 支持對稱多處理器方式(SMP)時的數據成員
(1) int processor;
進程正在使用的CPU。
(2) int last_processor;
進程最後一次使用的CPU。
(3) int lock_depth;
上下文切換時系統內核鎖的深度。
12. 其它數據成員
(1) unsigned short used_math;
是否使用FPU。
(2) char comm[16];
進程正在運行的可執行文件的文件名。
(3) struct rlimit rlim[RLIM_NLIMITS];
結構rlimit用於資源管理,定義在linux/include/linux/resource.h中,成員共有兩項:rlim_cur是資源的當前最大數目;rlim_max是資源可有的最大數目。在i386環境中,受控資源共有RLIM_NLIMITS項,即10項,定義在linux/include/asm/resource.h中,見下表:
(4) int errno;
最後一次出錯的系統調用的錯誤號,0表示無錯誤。系統調用返回時,全程量也擁有該錯誤號。
(5) long debugreg[8];
保存INTEL CPU調試寄存器的值,在ptrace系統調用中使用。
(6) struct exec_domain *exec_domain;
Linux可以運行由80386平臺其它UNIX操作系統生成的符合iBCS2標準的程序。關於此類程序與Linux程序差異的消息就由exec_domain結構保存。
(7) unsigned long personality;
Linux可以運行由80386平臺其它UNIX操作系統生成的符合iBCS2標準的程序。 Personality進一步描述進程執行的程序屬於何種UNIX平臺的“個性”信息。通常有PER_Linux、PER_Linux_32BIT、PER_Linux_EM86、PER_SVR3、PER_SCOSVR3、PER_WYSEV386、PER_ISCR4、PER_BSD、PER_XENIX和PER_MASK等,參見include/linux/personality.h。
(8) struct linux_binfmt *binfmt;
指向進程所屬的全局執行文件格式結構,共有a。out、script、elf和java等四種。結構定義在include/linux/binfmts.h中(core_dump、load_shlib(fd)、load_binary、use_count)。
(Array) int exit_code,exit_signal;
引起進程退出的返回代碼exit_code,引起錯誤的信號名exit_signal。
(10) int dumpable:1;
布爾量,表示出錯時是否可以進行memory dump。
(11) int did_exec:1;
按POSIX要求設計的布爾量,區分進程是正在執行老程序代碼,還是在執行execve裝入的新代碼。
(12) int tty_old_pgrp;
進程顯示終端所在的組標識。
(13) struct tty_struct *tty;
指向進程所在的顯示終端的信息。如果進程不需要顯示終端,如0號進程,則該指針爲空。結構定義在include/linux/tty.h中。
(14) struct wait_queue *wait_chldexit;
在進程結束時,或發出系統調用wait4後,爲了等待子進程的結束,而將自己(父進程)睡眠在該隊列上。結構定義在include/linux/wait.h中。