linux 快组描述符,Linux 进程描述符 task struct

大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进程描述符,具体是task_struct结构体存储相关的信息,在linux/sched.h文件里定义,那么我们先看看linux内核3.0版本的task_struct结构体的定义吧(删除了不必要的字段,只保留了重要的字段)。struct task_struct {

//这个是进程的运行时状态,-1代表不可运行,0代表可运行,>0代表已停止。

volatile longstate;

/*

flags是进程当前的状态标志,具体的如:

0x00000002表示进程正在被创建;

0x00000004表示进程正准备退出;

0x00000040 表示此进程被fork出,但是并没有执行exec;

0x00000400表示此进程由于其他进程发送相关信号而被杀死 。

*/

unsigned intflags;

//表示此进程的运行优先级

unsigned intrt_priority;

//这里出现了list_head结构体,详情请参考

structlist_head tasks;

//这里出现了mm_struct 结构体,该结构体记录了进程内存使用的相关情况,详情请参考

structmm_struct *mm;

/* 接下来是进程的一些状态参数*/

int exit_state;

int exit_code,exit_signal;

//这个是进程号

pid_t pid;

//这个是进程组号

pid_t tgid;

//real_parent是该进程的”亲生父亲“,不管其是否被“寄养”。

structtask_struct *real_parent;

//parent是该进程现在的父进程,有可能是”继父“

structtask_struct *parent;

//这里children指的是该进程孩子的链表,可以得到所有孩子的进程描述符,但是需使用list_for_each和list_entry,list_entry其实直接使用了container_of,详情请参考

struct list_headchildren;

//同理,sibling该进程兄弟的链表,也就是其父亲的所有孩子的链表。用法与children相似。

structlist_head sibling;

//这个是主线程的进程描述符,也许你会奇怪,为什么线程用进程描述符表示,因为linux并没有单独实现线程的相关结构体,只是用一个进程来代替线程,然后对其做一些特殊的处理。

structtask_struct *group_leader;

//这个是该进程所有线程的链表。

structlist_head thread_group;

//顾名思义,这个是该进程使用cpu时间的信息,utime是在用户态下执行的时间,stime是在内核态下执行的时间。

cputime_tutime, stime;

//下面的是启动的时间,只是时间基准不一样。

structtimespec start_time;

structtimespec real_start_time;

//comm是保存该进程名字的字符数组,长度最长为15,因为TASK_COMM_LEN为16。

charcomm[TASK_COMM_LEN];

/* 文件系统信息计数*/

intlink_count, total_link_count;

/*该进程在特定CPU下的状态*/

structthread_struct thread;

/* 文件系统相关信息结构体*/

structfs_struct *fs;

/* 打开的文件相关信息结构体*/

structfiles_struct *files;

/* 信号相关信息的句柄*/

structsignal_struct *signal;

structsighand_struct *sighand;

/*这些是松弛时间值,用来规定select()和poll()的超时时间,单位是纳秒nanoseconds  */

unsigned longtimer_slack_ns;

unsigned longdefault_timer_slack_ns;

};

可以知道

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这个文件夹。大多数进程信息同样可以使用top和ps这些用户级工具来获取。

本文出自 “七百七十七快” 博客,转载请与作者联系!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值