task_struct:
为了管理进程,操作系统必须对每个进程所做的事情进行清楚的描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块(PCB)。
在linux操作系统下这就是task_struct结构 ,所属的头文件#include <sched.h>每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,在任何时候操作系统都能够跟踪这个结构的信息,宰割结构是linux内核汇总最重要的数据结构,下面我们会详细的介绍。
这个进程的主要信息:
1、与进程相关的唯一标识符,区别正在执行的进程和其他进程
2、状态:描述进程的状态,因为进程有阻塞、挂起、运行等好几个状态,所以都有个表示符来记录进程的执行状态。
3、优先级:如果有好几个进程正在执行,就涉及到进程的执行的先后顺序,这和进程的优先级这个标识符有关。
4、程序计数器:程序中即将被执行指令的下一条地址。
5、内存指针:程序代码和进程相关数据的指针。
6、上下文数据:进程执行时处理器的寄存器中的数据。
7、I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
8、记账信息:包括处理机的时间总和,记账号等等。
保存进程信息的数据结构叫tast_struct,进程的信息可以通过/proc系统文件夹查看。要获取PID为400的进程信息,你需要查看/proc/400这个文件夹。
接下来就来给出一些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等四种。结构定义在incl