【Linux】PCB中的task_struct结构体
task_struct结构体
task_struct是进程控制块PCB中的一个结构体,用来存储进程的各种属性信息
这里面有进程状态,进程调度,进程标识符,进程通信,进程链接,时间和定时器,文件系统,虚拟内存信息以及页面管理信息,对称多处理机信息,上下文信息等
结构体内部信息介绍
1、进程状态
linux中的进程有多种状态,在进程的运行过程中,进程会随着调度在多种状态进行转换
进程的状态信息是进程进行调度的对换的依据
2、进程调度信息
进程调度则是用这部分信息来决定进程调度的优先次序,结合着进程状态信息来保证进程合理有序的运行
进程有多种调度信息,如先来先服务调度方式,时间片轮转调度方式,最近访问优先等调度方式
3、标识符
每一个进程都有进程标识符,用户标识符,组标识符
进程标识符PID就是用来标示不同的进程的,因为每一个进程都有唯一的标识符,就和学生拥有唯一的学号,一个人拥有唯一的身份证号码是一样的。内核就是通过这个标识符来识别不同的进程。
4、进程通信有关信息
如果多个进程在一个任务上执行协作,那么就需要这些进程可以互相访问对方的资源,互相通信
linux中的主要进程通信方式有:管道、信号量,共享内存,信号,和消息队列
5、进程链接信息
进程的创建是具有继承关系的。一个进程可以创建多个进程,这些子进程之间具有兄弟关系。
linux中,除了init进程,其他进程都有唯一一个父进程。
创建子进程可以通过fork()函数或者clone()函数。
除了PID外,子进程的task_struct结构体的大部分信息都是从父进程中拷贝过来的。系统有必要记录这些亲属关系,从而使进程之间的协作变得更加方便。
每个进程的task_struct结构有许多的指针,这些指针让系统中所有进程的task_struct结构构成了一颗进程树,这个进程树的根就是初始化进程init的task_struct结构体。
6、时间和定时器信息
一个进程从创建到终止叫做该进程的生存期(lifetime)。进程在其生存期内使用CPU的时间,内核都要进行记录,以便进行统计、计费等有关操作。进程耗费CPU的时间由两部分组成:一是在用户模式(或称为用户态)下耗费的时间、一是在系统模式(或称为系统态)下耗费的时间。每个时钟滴答,也就是每个时钟中断,内核都要更新当前进程耗费CPU的时间信息。
7、文件系统信息
进程可以打开或关闭文件,文件属于系统资源,Linux内核要对进程使用文件的情况进行记录。task_struct结构中有两个数据结构用于描述进程与文件相关的信息。其中,fs_struct中描述了两个VFS索引节点(VFS inode),这两个索引节点叫做root和pwd,分别指向进程的可执行映象所对应的根目录(home directory)和当前目录或工作目录。file_struct结构用来记录了进程打开的文件的描述符
8、虚拟内存信息
除了内核线程之外,每个进程都拥有自己的地址空间(也叫虚拟空间),用mm_struct来描述。另外Linux2.4还引入了另外一个域active_mm,这是为内核线程而引入。因为内核线程没有自己的地址空间,为了让内核线程与普通进程具有统一的上下文切换方式,当内核线程进行上下文切换时,让切换进来的线程的active_mm 指向刚被调度出去的进程的active_mm
9、页面管理信息
当物理内存不足时,linux内存管理系统需要将内存的部分页面转到外存,其交换是以页为单位的
10、对称多处理机信息
11、上下文信息
这里要特别注意标题:和“处理器”相关的环境信息。进程作为一个执行环境的综合,当系统调度某个进程执行,即为该进程建立完整的环境时,处理器(processor)的寄存器、堆栈等是必不可少的。因为不同的处理器对内部寄存器和堆栈的定义不尽相同,所以叫做“和处理器相关的环境”,也叫做“处理机状态”。当进程暂时停止运行时,处理机状态必须保存在进程的task_struct结构中,当进程被调度重新运行时再从中恢复这些环境,也就是恢复这些寄存器和堆栈的值。