task_struct结构体

来源:互联网 发布:电脑游戏录制视频软件 编辑:程序博客网 时间:2024/06/15 19:17

  task_struct是Linux内核的一种数据结构,它会被装载到RAM里并且包含着进程的信息。 每个进程都把它的信息放在 task_struct 这个数据结构里,task_struct 包含了这些内容:     标示符 : 描述本进程的唯一标示符,用来区别其他进程。

  状态    :任务状态,退出代码,退出信号等。       

  优先级 :相对于其他进程的优先级。  

  程序计数器:程序中即将被执行的下一条指令的地址。   

  内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针  

  上下文数据:进程执行时处理器的寄存器中的数据。  

  I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使⽤用的文件列表。  

  记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

   保存进程信息的数据结构叫做 task_struct,并且可以在 include/linux/sched.h 里找到它。 所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。    

   进程的信息可以通过 /proc 系统文件夹查看。要获取PID为400的进程信息,你需要查看 / proc/400 这个⽂文件夹。大i多数进程信息同样可以使用top和ps这些用户级工具来获取

tast_struct结构描述

1、进程状态(state)

进程执行时,它会根据具体情况改变状态 。进程状态是调度和对换的依据。一个进程可以有好几个状态

下⾯面的状态在 fs/proc/array.c 文件里定义:

static const char * const task_state_array[] = { 

"R (running)", /* 0 */                        可运行

 "S (sleeping)", /* 1 */                       休眠         可中断的等待状态     状态可被杀死

 "D (disk sleep)", /* 2 */                   磁盘休眠    

"T (stopped)", /* 4 */                       暂停

"t (tracing stop)", /* 8 */

 "X (dead)", /* 16 */                           

"Z (zombie)", /* 32 */ };                   僵死

运行状态(running)并不意味着进程⼀一定在运行中,它表明进程要么是在运行中 要么在运 行队列里。系统中有一个运行队列(run_queue),用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行。

睡眠状态(sleeping)意味着进程在等待事件完成(这里的睡眠有时候也叫做可 中断睡眠(interruptible sleep))。

磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状 态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。   

暂停状态 (stoped)此时的进程暂时停止运行来接受某种特殊处理,例如,正接受调试的进程就处于这种状态。

 kill -SIGSTOP <pid>       发送SIGSTOP止(T)进程

 kill -SIGCONT <pid>       发送SIGCONT  让进程继续运行

可以使用僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调 用)没有读取到子进程退出的返回代码时就会产生僵死进程。僵死进程会以终止状态保持 在进程表中,并且会一直在等待父进程读取退出状态代码。这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。

 gdb终止进程来实现跟踪终止状态

 一个进程不在running状态,不占有CPU内存

2、进程调度信息

这一部分信息通常包括进程的类别(普通进程还是实时进程)、进程的优先级等等。

need_resched                                 调度标志  下一次调度机会调用调度程序schedule()、 counter代表进程剩余的时间片,是进程调度的主要依据

Nice                                            静态优先级             代表进程的时间片   用于对counter赋值   可被nice()改变

Counter                                      动态优先级

Policy                                          调度策略                实时进程与普通进程的调度策略不同

rt_priority                                    实时优先级            只对实时进程有意义,它是实时进程调度的依据 

三种调度策略(名称    解释     适用范围

SCHED_OTHER               其他调度                   普通进程

SCHED_FIFO                   先来先调度服务          实时进程

SCHED_RR                    时间片轮转调度             实时进程

进程调度的策略

只有root用户能通过sched_setscheduler()系统调用来改变调度策略。

3、标识符

每个进程都有一个唯一的标识符,内核通过这个标识符来识别不同的进程,同时,进程标识符PID也是内核提供给用户程序的接口,用户程序通过PID对进程发号施令。PID是32位的无符号整数,它被顺序编号:新创建进程的PID通常是前一个进程的PID加1。在Linux上允许的最大PID号是32767

Pid                    进程标识符

Uid、gid           用户标识符、组标识符

Euid、egid       有效用户标识符、有效组标识符

Suid、sgid       备份用户标识符、备份组标识符

Fsuid、fsgid       文件系统用户标识符、文件组标识符

每个进程都属于某个用户组。task_struct结构中定义有用户标识符和组标识符。它们同样是简单的数字,这两种标识符用于系统的安全控制。系统通过这两种标识符控制进程对系统中文件和设备的访问,

4、进程邻接信息

在Linux系统中,除了初始化进程init,其他进程都有一个父进程(parent process)或称为双亲进程。可以通过fork()或clone()系统调用来创建子进程,除了进程标识符(PID)等必要的信息外,子进程的task_struct结构中的绝大部分的信息都是从父进程中拷贝,或说“克隆”过来的。系统有必要记录这种“亲属”关系,使进程之间的协作更加方便,例如父进程给子进程发送杀死(kill)信号、父子进程通信等,就可以用这种关系很方便地实现。

每个进程的task_struct结构有许多指针,通过这些指针,系统中所有进程的task_struct结构就构成了一棵进程树,这棵进程树的根就是初始化进程init的task_struct结构(init进程是Linux内核建立起来后人为创建的一个进程,是所有进程的祖先进程)。

5、文件系统信息

进程可以打开或关闭文件,文件属于系统资源,Linux内核要对进程使用文件的情况进行记录。task_struct结构中有两个数据结构用于描述进程与文件相关的信息。其中,fs_struct中描述了两个VFS索引节点(VFS inode),这两个索引节点叫做root和pwd,分别指向进程的可执行映象所对应的根目录(home directory)和当前目录或工作目录。file_struct结构用来记录了进程打开的文件的描述符(descriptor)。

定义形式

Struct fs_struct *fs          进程可执行影像所在的文件系统

Struct  files_struct *files   进程打开的文件

在文件系统中,每个VFS索引节点唯一描述一个文件或目录,同时该节点也是向更低层的文件系统提供的统一的接口。

6、页面管理信息

   当物理内存不足时,Linux内存管理子系统需要把内存中的部分页面交换到外存,其交换是以页为单位的。

定义形式                                                         解释

Int swappable                                                进程占用的内存页面是否可换出

Unsigned long min_flat,maj_flt,nswap           进程累计的次(minor)缺页次数、主(major)次数及累计换出、换入页面数

Unsigned long cmin_flat,cmaj_flt,cnswap     本进程作为祖先进程,其所有层次子进


0 0