• Linux进程管理描述符 task_struct


    转:http://blog.csdn.net/hongchangfirst/article/details/7075026

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

     1 struct task_struct {
     2 //这个是进程的运行时状态,-1代表不可运行,0代表可运行,>0代表已停止。
     3  volatile long state;
     4  /*
     5 flags是进程当前的状态标志,具体的如:
     6 0x00000002表示进程正在被创建;
     7 0x00000004表示进程正准备退出;
     8 0x00000040 表示此进程被fork出,但是并没有执行exec;
     9 0x00000400表示此进程由于其他进程发送相关信号而被杀死 。
    10 */
    11  unsigned int flags; 
    12 //表示此进程的运行优先级,prio表示动态优先级,根据static_prio和交互性奖罚算出,static_prio是进程的静态优先级,在进程创建时确定,范围从-20到19,越小优先级越高。
    13 int prio, static_prio, normal_prio;
    14 //这里出现了list_head结构体,详情请参考http://blog.csdn.net/hongchangfirst/article/details/7076225
    15  struct list_head tasks;
    16 //这里出现了mm_struct 结构体,该结构体记录了进程内存使用的相关情况,详情请参考http://blog.csdn.net/hongchangfirst/article/details/7076207
    17  struct mm_struct *mm;
    18 /* 接下来是进程的一些状态参数*/
    19  int exit_state;
    20  int exit_code, exit_signal;
    21 //这个是进程号,注意这是内核自己维护的进程号,因为在Linux中线程是由进程实现的,用户看到的进程号是tgid域。
    22  pid_t pid;
    23 //这个是线程组号,和线程组内的领头进程的进程号一致,我们在用户程序中调用getpid()其实返回的是tgid值。
    24  pid_t tgid;
    25 //real_parent是该进程的”亲生父亲“,不管其是否被“寄养”。
    26  struct task_struct *real_parent;
    27 //parent是该进程现在的父进程,有可能是”继父“
    28  struct task_struct *parent; 
    29 //这里children指的是该进程孩子的链表,可以得到所有孩子的进程描述符,但是需使用list_for_each和list_entry,list_entry其实直接使用了container_of,详情请参考http://blog.csdn.net/hongchangfirst/article/details/7076225
    30  struct list_head children; 
    31 //同理,sibling该进程兄弟的链表,也就是其父亲的所有孩子的链表。用法与children相似。
    32  struct list_head sibling; 
    33 //这个是主线程的进程描述符,也许你会奇怪,为什么线程用进程描述符表示,因为linux并没有单独实现线程的相关结构体,只是用一个进程来代替线程,然后对其做一些特殊的处理。
    34  struct task_struct *group_leader; 
    35 //这个是该进程所有线程的链表。
    36  struct list_head thread_group;
    37 //顾名思义,这个是该进程使用cpu时间的信息,utime是在用户态下执行的时间,stime是在内核态下执行的时间。
    38  cputime_t utime, stime;
    39 //下面的是启动的时间,只是时间基准不一样。
    40  struct timespec start_time;   
    41  struct timespec real_start_time;
    42 //comm是保存该进程名字的字符数组,长度最长为15,因为TASK_COMM_LEN为16。
    43  char comm[TASK_COMM_LEN];
    44 /* 文件系统信息计数*/
    45  int link_count, total_link_count;
    46 /*该进程在特定CPU下的状态*/
    47  struct thread_struct thread;
    48 /* 文件系统相关信息结构体*/
    49  struct fs_struct *fs;
    50 /* 打开的文件相关信息结构体 */
    51  struct files_struct *files;
    52  /* 信号相关信息的句柄*/
    53  struct signal_struct *signal;
    54  struct sighand_struct *sighand;
    55  /*这些是松弛时间值,用来规定select()和poll()的超时时间,单位是纳秒nanoseconds  */
    56  unsigned long timer_slack_ns;
    57  unsigned long default_timer_slack_ns;
    58 };
  • 相关阅读:
    python全局变量与局部变量
    TCP的三次握手四次挥手
    关于Http的面试题
    HSTS
    关于网络安全攻防知识
    http详解
    python中的f''、b''、u''、r''
    常见SQL Server导入导出数据的几个工具
    chrome浏览器中 F12 功能的简单介绍
    Sqlcmd使用详解
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/7484034.html
Copyright © 2020-2023  润新知