当前位置: 首页 > 工具软件 > task_list > 使用案例 >

task_struct解析

司马宏邈
2023-12-01

task_struct是Linux内核的一种数据结构,它用task_struct结构体来描述进程的信息。下面来剖析一下进程中保存的主要的信息有哪些?

struct task_struct {

        //进程的运行时状态
        volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
        void *stack;   
        atomic_t usage;

        //进程当前的状态
        /*
        0x00000002表示进程正在被创建;

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

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

        0x00000400表示此进程由于其他进程发送相关信号而被杀死 。
        */
        unsigned int flags;     /* per process flags, defined below */


        unsigned int ptrace;
        int on_rq;

        //表示此进程的运行优先级,prio表示动态优先级,根据static_prio和交互性奖罚算出,static_prio是进程的静态优先级,在进程创建时确定,范围从-20到19,越小优先级越高。
        int prio, static_prio, normal_prio;

        //进程的运行优先级
        unsigned int rt_priority;

        //list_head结构体
         struct list_head tasks;

        //mm_struct结构体,描述了进程内存的相关情况
         struct mm_struct *mm, *active_mm;

         /* per-thread vma caching */
         u32 vmacache_seqnum;
         struct vm_area_struct *vmacache[VMACACHE_SIZE];

        /* task state */
        //进程的状态参数
         int exit_state;
         int exit_code, exit_signal;

        //父进程退出后信号被发送
        int pdeath_signal;  /*  The signal sent when the parent dies  */ 

         /* scheduler bits, serialized by scheduler locks */
         unsigned sched_reset_on_fork:1;
         unsigned sched_contributes_to_load:1;
         unsigned sched_migrated:1;
         unsigned sched_remote_wakeup:1;
         unsigned :0; /* force alignment to the next boundary */

         /* unserialized, strictly 'current' */
         unsigned in_execve:1; /* bit to tell LSMs we're in execve */
         unsigned in_iowait:1;

         struct restart_block restart_block;

        //进程号
        pid_t pid;
        //进程组号
        pid_t tgid;


         //进程的亲身父亲
         struct task_struct __rcu *real_parent; /* real parent process */
         //进程的现在的父亲,可能为继父
         struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
         //进程的孩子链表
         struct list_head children;      /* list of my children */
         //进程兄弟的链表
         struct list_head sibling;       /* linkage in my parent's children list */
         //主线程的进程描述符
         struct task_struct *group_leader;       /* threadgroup leader */

         /* PID/PID hash table linkage. */
         struct pid_link pids[PIDTYPE_MAX];

         //该进程的所有线程链表
         struct list_head thread_group;
         struct list_head thread_node;

        //该进程使用cpu时间的信息,utime是在用户态下执行的时间,stime是在内核态下执行的时间。
        cputime_t utime, stime;

        cputime_t gtime;
        struct prev_cputime prev_cputime;

        //启动时间,,只是时间基准不一样
        u64 start_time;         /* monotonic time in nsec */
        u64 real_start_time;    /* boot based time in nsec */

        struct task_cputime cputime_expires;

        //list_head的CPU时间
        struct list_head cpu_timers[3];

        //保存进程名字的数组,一般数组大小为15位
        char comm[TASK_COMM_LEN];

        /* file system info */
        //文件系统信息
        struct nameidata *nameidata;

        /* 文件系统信息计数*/
        int link_count, total_link_count;

        /* filesystem information */
        //文件系统相关信息结构体
         struct fs_struct *fs;

        /* open file information */
        //打开文件信息的结构体
         struct files_struct *files;

        /* namespaces */
         struct nsproxy *nsproxy;

        /* signal handlers */
        //信号相关信息的句柄
         struct signal_struct *signal;
         struct sighand_struct *sighand;

         struct callback_head *task_works;

         struct audit_context *audit_context;

         struct seccomp seccomp;

        /* Thread group tracking */
         u32 parent_exec_id;
         u32 self_exec_id;

        /* journalling filesystem info */
         void *journal_info;

        /* VM state */
         struct reclaim_state *reclaim_state;

         struct backing_dev_info *backing_dev_info;

         struct io_context *io_context;

         unsigned long ptrace_message;
         siginfo_t *last_siginfo; /* For ptrace use.  */


         /*
          * time slack values; these are used to round up poll() and
          * select() etc timeout values. These are in nanoseconds.
          */
         //松弛时间值,用来记录select和poll的超时时间,单位为ns
         u64 timer_slack_ns;
         u64 default_timer_slack_ns;


        /* CPU-specific state of this task */
        //该进程在特定CPU下的状态
        struct thread_struct thread;

};

今天我们只是简单的了解了一下进程的信息,往后会再详细讲解进程。

 类似资料: