1.在Linux中描述进程的结构体叫做task_struct
2.task_struct是Linux内核的一种数据结构,它会被装载到PAM(内存)里并且包含着进程的信息
3.task_struct内容的分类
标识符:描述本进程的唯一标识符,用来区别其他进程。
状态:任务状态,退出代码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
其他信息
task_struct结构是进程实体的核心,Linux内核通过该结构来控制进程:首先通过其中的调度信息决定该进程是否运行;当该进程运行时,根据其中保存的处理机状态信息来恢复进程运行现场,然后根据虚拟内存信息,找到程序的正文和数据;通过其中的通信信息和其他进程实现同步、通信等合作。几乎所有的操作都要依赖该结构,所以,task_struct结构是一个进程存在的唯一标志。
下面我们深度的理解下进程的各个字段的含义:
task_struct //进程描述符
Struct task_struct
{
1、支持对称多处理器方式(SMP)时的数据成员
(1)int processor;
进程正在使用的CPU
(2)int last_processor;
进程最后一次使用的CPU
(3)int lock_depth;
上下文切换时系统内核锁的深度
2、其他数据成员
(1)unsigned short used_math; //是否使用MPU
(2)char comm[16]; //进程正在运行的可执行文件的文件名
(3)struct rlimit rlim[RLIM_NLIMITS]; //结构rlimit用于资源管理,定义在linux/include/linux/resource.h中,成员共有两项:rlim_cur是资源的当前最大数目;rlim_max是资源可有的最大数目。
(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等,
(8)struct linux_binfmt *binfmt; //指向进程所属的全局执行文件格式结构,共有a。out、script、elf和java等四种。结构定义在include/linux/binfmts.h中(core_dump、load_shlib(fd)、load_binary、use_count)。
(9)int exit_code,exit_signal; //引起进程退出的返回代码exit_code,引起错误的信号名exit_signal。
(10)int dumpable:1; //布尔量,表示出错时是否可以进行memory dump。
(11)int did_exec:1; //按POSIX要求设计的布尔量,区分进程是正在执行老程序代码,还是在执行execve装入的新代码。