虛存地址比swap_address低的進(jìn)程頁(yè)面,以前已經(jīng)換出或已換出過(guò),進(jìn)程下一次可換出的頁(yè)面自swap_address開(kāi)始。參見(jiàn)swap_out_process()和swap_out_pmd()(見(jiàn)mm/vmscan.c)。
(3) unsigned long min_flt,maj_flt;
該進(jìn)程累計(jì)的minor缺頁(yè)次數(shù)和major缺頁(yè)次數(shù)。maj_flt基本與min_flt相同,但計(jì)數(shù)的范圍比后者廣(參見(jiàn)fs/buffer.c和mm/page_alloc.c)。min_flt只在do_no_page()、do_wp_page()里(見(jiàn)mm/memory.c)計(jì)數(shù)新增的可以寫(xiě)操作的頁(yè)面。
(4) unsigned long nswap;
該進(jìn)程累計(jì)換出的頁(yè)面數(shù)。
(5) unsigned long cmin_flt,cmaj_flt,cnswap;
以本進(jìn)程作為祖先的所有層次子進(jìn)程的累計(jì)換入頁(yè)面、換出頁(yè)面計(jì)數(shù)。
(6) unsigned long old_maj_flt,dec_flt; (7) unsigned long swap_cnt;
下一次信號(hào)最多可換出的頁(yè)數(shù)。
11. 支持對(duì)稱多處理器方式(SMP)時(shí)的數(shù)據(jù)成員 (1) int processor;
進(jìn)程正在使用的CPU。
(2) int last_processor;
進(jìn)程最后一次使用的CPU。
(3) int lock_depth;
上下文切換時(shí)系統(tǒng)內(nèi)核鎖的深度。
12. 其它數(shù)據(jù)成員 (1) unsigned short used_math;
是否使用FPU。
(2) char comm[16];
進(jìn)程正在運(yùn)行的可執(zhí)行文件的文件名。
(3) struct rlimit rlim[RLIM_NLIMITS];
結(jié)構(gòu)rlimit用于資源管理,定義在linux/include/linux/resource.h中,成員共有兩項(xiàng):rlim_cur是資源的當(dāng)前最大數(shù)目;rlim_max是資源可有的最大數(shù)目。在i386環(huán)境中,受控資源共有RLIM_NLIMITS項(xiàng),即10項(xiàng),定義在linux/include/asm/resource.h中,見(jiàn)下表:
(4) int errno;
最后一次出錯(cuò)的系統(tǒng)調(diào)用的錯(cuò)誤號(hào),0表示無(wú)錯(cuò)誤。系統(tǒng)調(diào)用返回時(shí),全程量也擁有該錯(cuò)誤號(hào)。
(5) long debugreg[8];
保存INTEL CPU調(diào)試寄存器的值,在ptrace系統(tǒng)調(diào)用中使用。
(6) struct exec_domain *exec_domain;
Linux可以運(yùn)行由80386平臺(tái)其它UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序。關(guān)于此類程序與Linux程序差異的消息就由exec_domain結(jié)構(gòu)保存。
(7) unsigned long personality;
Linux可以運(yùn)行由80386平臺(tái)其它UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序。 Personality進(jìn)一步描述進(jìn)程執(zhí)行的程序?qū)儆诤畏NUNIX平臺(tái)的“個(gè)性”信息。通常有PER_Linux、PER_Linux_32BIT、PER_Linux_EM86、PER_SVR3、PER_SCOSVR3、PER_WYSEV386、PER_ISCR4、PER_BSD、PER_XENIX和PER_MASK等,參見(jiàn)include/linux/personality.h。
(8) struct linux_binfmt *binfmt;
指向進(jìn)程所屬的全局執(zhí)行文件格式結(jié)構(gòu),共有a。out、script、elf和java等四種。結(jié)構(gòu)定義在include/linux/binfmts.h中(core_dump、load_shlib(fd)、load_binary、use_count)。
(Array) int exit_code,exit_signal;
引起進(jìn)程退出的返回代碼exit_code,引起錯(cuò)誤的信號(hào)名exit_signal。
(9) int dumpable:1;
布爾量,表示出錯(cuò)時(shí)是否可以進(jìn)行memory dump。
(10) int did_exec:1;
按POSIX要求設(shè)計(jì)的布爾量,區(qū)分進(jìn)程是正在執(zhí)行老程序代碼,還是在執(zhí)行execve裝入的新代碼。
(11) int tty_old_pgrp;
進(jìn)程顯示終端所在的組標(biāo)識(shí)。
(12) struct tty_struct *tty;
指向進(jìn)程所在的顯示終端的信息。如果進(jìn)程不需要顯示終端,如0號(hào)進(jìn)程,則該指針為空。結(jié)構(gòu)定義在include/linux/tty.h中。
(13) struct wait_queue *wait_chldexit;
在進(jìn)程結(jié)束時(shí),或發(fā)出系統(tǒng)調(diào)用wait4后,為了等待子進(jìn)程的結(jié)束,而將自己(父進(jìn)程)睡眠在該隊(duì)列上。結(jié)構(gòu)定義在include/linux/wait.h中。
13. 進(jìn)程隊(duì)列的全局變量 (1) current;
當(dāng)前正在運(yùn)行的進(jìn)程的指針,在SMP中則指向CPU組中正被調(diào)度的CPU的當(dāng)前進(jìn)程:
#define current(0+current_set[smp_processor_id()])/sched.h/
struct task_struct *current_set[NR_CPUS];
(2) struct task_struct init_task;
即0號(hào)進(jìn)程的PCB,是進(jìn)程的“根”,始終保持初值INIT_TASK。
(3) struct task_struct *task[NR_TASKS];
進(jìn)程隊(duì)列數(shù)組,規(guī)定系統(tǒng)可同時(shí)運(yùn)行的最大進(jìn)程數(shù)(見(jiàn)kernel/sched.c)。NR_TASKS定義在include/linux/tasks.h中,值為512。每個(gè)進(jìn)程占一個(gè)數(shù)組元素(元素的下標(biāo)不一定就是進(jìn)程的pid),task[0]必須指向init_task(0號(hào)進(jìn)程)??梢酝ㄟ^(guò)task[]數(shù)組遍歷所有進(jìn)程的PCB。但Linux也提供一個(gè)宏定義for_each_task()(見(jiàn)include/linux/sched.h),它通過(guò)next_task遍歷所有進(jìn)程的PCB:
#define for_each_task(p) \
for(p=&init_task;(p=p-》next_task)!=&init_task;)
(4) unsigned long volatile jiffies;
Linux的基準(zhǔn)時(shí)間(見(jiàn)kernal/sched.c)。系統(tǒng)初始化時(shí)清0,以后每隔10ms由時(shí)鐘中斷服務(wù)程序do_timer()增1。
(5) int need_resched;
重新調(diào)度標(biāo)志位(見(jiàn)kernal/sched.c)。當(dāng)需要Linux調(diào)度時(shí)置位。在系統(tǒng)調(diào)用返回前(或者其它情形下),判斷該標(biāo)志是否置位。置位的話,馬上調(diào)用schedule進(jìn)行CPU調(diào)度。
(6) unsigned long intr_count;
記錄中斷服務(wù)程序的嵌套層數(shù)(見(jiàn)kernal/softirq.c)。正常運(yùn)行時(shí),intr_count為0。當(dāng)處理硬件中斷、執(zhí)行任務(wù)隊(duì)列中的任務(wù)或者執(zhí)行bottom half隊(duì)列中的任務(wù)時(shí),intr_count非0。這時(shí),內(nèi)核禁止某些操作,例如不允許重新調(diào)度。
評(píng)論