虛存地址比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。
(9) int dumpable:1;
布爾量,表示出錯時是否可以進行memory dump。
(10) int did_exec:1;
按POSIX要求設計的布爾量,區分進程是正在執行老程序代碼,還是在執行execve裝入的新代碼。
(11) int tty_old_pgrp;
進程顯示終端所在的組標識。
(12) struct tty_struct *tty;
指向進程所在的顯示終端的信息。如果進程不需要顯示終端,如0號進程,則該指針為空。結構定義在include/linux/tty.h中。
(13) struct wait_queue *wait_chldexit;
在進程結束時,或發出系統調用wait4后,為了等待子進程的結束,而將自己(父進程)睡眠在該隊列上。結構定義在include/linux/wait.h中。
13. 進程隊列的全局變量 (1) current;
當前正在運行的進程的指針,在SMP中則指向CPU組中正被調度的CPU的當前進程:
#define current(0+current_set[smp_processor_id()])/sched.h/
struct task_struct *current_set[NR_CPUS];
(2) struct task_struct init_task;
即0號進程的PCB,是進程的“根”,始終保持初值INIT_TASK。
(3) struct task_struct *task[NR_TASKS];
進程隊列數組,規定系統可同時運行的最大進程數(見kernel/sched.c)。NR_TASKS定義在include/linux/tasks.h中,值為512。每個進程占一個數組元素(元素的下標不一定就是進程的pid),task[0]必須指向init_task(0號進程)。可以通過task[]數組遍歷所有進程的PCB。但Linux也提供一個宏定義for_each_task()(見include/linux/sched.h),它通過next_task遍歷所有進程的PCB:
#define for_each_task(p) \
for(p=&init_task;(p=p-》next_task)!=&init_task;)
(4) unsigned long volatile jiffies;
Linux的基準時間(見kernal/sched.c)。系統初始化時清0,以后每隔10ms由時鐘中斷服務程序do_timer()增1。
(5) int need_resched;
重新調度標志位(見kernal/sched.c)。當需要Linux調度時置位。在系統調用返回前(或者其它情形下),判斷該標志是否置位。置位的話,馬上調用schedule進行CPU調度。
(6) unsigned long intr_count;
記錄中斷服務程序的嵌套層數(見kernal/softirq.c)。正常運行時,intr_count為0。當處理硬件中斷、執行任務隊列中的任務或者執行bottom half隊列中的任務時,intr_count非0。這時,內核禁止某些操作,例如不允許重新調度。
評論
查看更多