【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结构中,当进程被调度重新运行时再从中恢复这些环境,也就是恢复这些寄存器和堆栈的值。


12、其他

(1)  struct wait_queue *wait_chldexit

在进程结束时,或发出系统调用wait4时,为了等待子进程的结束,而将自己(父进程)睡眠在该等待队列上,设置状态标志为TASK_INTERRUPTIBLE,并且把控制权转给调度程序。

(2)Struct rlimit rlim[RLIM_NLIMITS];

每一个进程可以通过系统调用setlimit和getlimit来限制它资源的使用。

(3)Int exit_code exit_signal;

程序的返回代码以及程序异常终止产生的信号,这些数据由父进程(子进程完成后)轮流查询。

(4)Char comm[16]

这个域存储进程执行的程序的名字,这个名字用在调试中。

(5)Unsigned long personality;

 Linux可以运行X86平台上其它Unix操作系统生成的符合iBCS2标准的程序, personality进一步描述进程执行的程序属于何种Unix平台的“个性”信息。通常有PER_Linux,PER_Linux_32BIT,PER_Linux_EM86,PER_SVR4,PER_SVR3,PER_SCOSVR3,PER_WYSEV386,PER_ISCR4,PER_BSD,PER_XENIX和PER_MASK等,参见include/Linux/personality.h>。

(6) int did_exec:1;

按POSIX要求设计的布尔量,区分进程正在执行老程序代码,还是用系统调用execve()装入一个新的程序。

(7)struct linux_binfmt *binfmt

指向进程所属的全局执行文件格式结构,共有a.out、script、elf、java等四种。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章