本文的重点是剖析task_struct,在这之前我们先来认识下进程的概念和linux进程控制块PCB
首先什么是进程?
1>进程是程序的一个执行的实例;
2>进程是正在执行的程序
3>进程是能分配处理器并由处理器执行的实体
按内核的观点来谈进程:它所担当分配系统资源(CPU时间,内存)的实体。
进程的两个基本的元素如下:
一、程序代码(可能被执行相同程序的其它进程共享)二是和代码相关联的数据集。这里和代码相关联的数据集指的是数据段和进程控制块。进程是一种动态描述,但是并不代表所有的进程都在运行。(进程在内存中因策略或调度需求,会处于各种状态)。
task_struct:
为了管理进程,操作系统必须对每个进程所做的事情进行清楚的描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块(PCB)。
PCB在linux操作系统下就是task_struct结构 ,所属的头文件#include <sched.h>每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,在任何时候操作系统都能够跟踪这个结构的信息,宰割结构是linux内核汇总最重要的数据结构,下面我们会详细的介绍。
这个进程的主要信息:
1、pid_t pid标识符:与进程相关的唯一标识符,区别正在执行的进程和其他进程
2、状态:描述进程的状态,因为进程有阻塞、挂起、运行等好几个状态,所以都有个表示符来记录进程的执行状态。
3、优先级:如果有好几个进程正在执行,就涉及到进程的执行的先后顺序,这和进程的优先级这个标识符有关。
4、程序计数器:程序中即将被执行指令的下一条地址。
5、内存指针:程序代码和进程相关数据的指针。
6、上下文数据:进程执行时处理器的寄存器中的数据。
7、I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
8、记账信息:包括处理机的时间总和,记账号等等。
进程的信息可以通过/proc系统文件夹查看。假如要获取PID为400的进程信息,你需要查看/proc/400这个文件夹。
接下来就来给出一些task_struct各个字段的介绍:
进程信息同样可以使用ps命令来获取。
假如我们获取pid 为3040的这个进程信息
下面我们深度的理解下进程的各个字段的含义:
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