Linux进程控制块 task_struct

转载 2016年05月31日 16:56:54

转载自:http://memorymyann.iteye.com/blog/235363

/////////////////////////////////////////////////////////////////////////////////////////////////////////

struct task_struct {

    /*
     * offsets of these are hardcoded elsewhere - touch with care
     */
    volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */ //进程当前的状态
    unsigned long flags;    /* per process flags, defined below */    //反应进程状态的信息,但不是运行状态,定义见下
    int sigpending; //进程收到了信号,但尚未处理
    mm_segment_t addr_limit;    /* thread address space: //虚存地址上限
                         0-0xBFFFFFFF for user-thead
                        0-0xFFFFFFFF for kernel-thread
                     */
    struct exec_domain *exec_domain;
    volatile long need_resched;    //与进程调度有关表示用户从系统空间按返回用户空间要执行的一次调度
    unsigned long ptrace;

    int lock_depth;        /* Lock depth */

/*
 * offset 32 begins here on 32-bit platforms. We keep
 * all fields in a single cacheline that are needed for
 * the goodness() loop in schedule().
 */
    long counter; //与进程调度相关
    long nice;
    unsigned long policy;    //实用于本进程的调度政策
    struct mm_struct *mm;
    int processor;
    /*
     * cpus_runnable is ~0 if the process is not running on any
     * CPU. It's (1 << cpu) if it's running on a CPU. This mask
     * is updated under the runqueue lock.
     *
     * To determine whether a process might run on a CPU, this
     * mask is AND-ed with cpus_allowed.
     */
    unsigned long cpus_runnable, cpus_allowed;
    /*
     * (only the 'next' pointer fits into the cacheline, but
     * that's just fine.)
     */
    struct list_head run_list;
    unsigned long sleep_time;

    struct task_struct *next_task, *prev_task; //内核会对每一个进程做点什么事情的时候,常常需要将其连成一个队列,这2个指针用于这个目的
    struct mm_struct *active_mm;
    struct list_head local_pages;
    unsigned int allocation_order, nr_local_pages;

/* task state */
    struct linux_binfmt *binfmt;//应用文件格式
    int exit_code, exit_signal;
    int pdeath_signal;  /*  The signal sent when the parent dies  */
    /* ??? */
    unsigned long personality; //进程的个性化信息,详细见下
    int did_exec:1;
    unsigned task_dumpable:1;
    pid_t pid; //进程号
    pid_t pgrp;
    pid_t tty_old_pgrp;
    pid_t session;
    pid_t tgid;
    /* boolean value for session group leader */
    int leader;
    /* 
     * pointers to (original) parent process, youngest child, younger sibling,
     * older sibling, respectively.  (p->father can be replaced with 
     * p->p_pptr->pid)
     */
    struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr; //用于族谱信息的,例如p_opptr指向父进程
    struct list_head thread_group;

    /* PID hash table linkage. */
    struct task_struct *pidhash_next;
    struct task_struct **pidhash_pprev; //pid是随机分配的,我们常常使用kill pid想进程发送信号(大部分人认为是杀死进程,其实这是个发送信号的指令,默认的参数为杀死。如果想暂停某进程,只需kill STOP 进程的PID),这里可以看到根据pid寻找进程的操作是经常被使用的,而pid又是随机分配,于是这里边用这2个指针指向一个杂凑数组,数组是按照杂凑的算法,以pid为关键字建立,方便根据pid来寻找task_struct

    wait_queue_head_t wait_chldexit;    /* for wait4() */
    struct completion *vfork_done;        /* for vfork() */
    unsigned long rt_priority;    //优先级
    unsigned long it_real_value, it_prof_value, it_virt_value;
    unsigned long it_real_incr, it_prof_incr, it_virt_incr;
    struct timer_list real_timer;
    struct tms times; //运行时间的总汇
    unsigned long start_time;
    long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; //在多个处理器上运行于系统空间和用户空间的时间
/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
    unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;//发生页面异常的次数和换入换出的次数
    int swappable:1;
/* process credentials */
    uid_t uid,euid,suid,fsuid;
    gid_t gid,egid,sgid,fsgid; //与文件权限有关的
    int ngroups;
    gid_t    groups[NGROUPS];
    kernel_cap_t   cap_effective, cap_inheritable, cap_permitted; //权限,比如该进程是否有权限从新引导系统,这里是大概介绍
    int keep_capabilities:1;
    struct user_struct *user;    //指向该进程拥有的用户
/* limits */
    struct rlimit rlim[RLIM_NLIMITS]; //进程对各种资源使用数量的限制,详细见下
    unsigned short used_math;
    char comm[16];
/* file system info */
    int link_count, total_link_count;
    struct tty_struct *tty; /* NULL if no tty */
    unsigned int locks; /* How many file locks are being held */
/* ipc stuff */
    struct sem_undo *semundo;
    struct sem_queue *semsleeping;
/* CPU-specific state of this task */
    struct thread_struct thread;
/* filesystem information */
    struct fs_struct *fs;
/* open file information */
    struct files_struct *files;
/* namespace */
    struct namespace *namespace;
/* signal handlers */
    spinlock_t sigmask_lock;    /* Protects signal and blocked */
    struct signal_struct *sig;

    sigset_t blocked;
    struct sigpending pending;

    unsigned long sas_ss_sp;
    size_t sas_ss_size;
    int (*notifier)(void *priv);
    void *notifier_data;
    sigset_t *notifier_mask;
    
/* Thread group tracking */
       u32 parent_exec_id;
       u32 self_exec_id;
/* Protection of (de-)allocation: mm, files, fs, tty */
    spinlock_t alloc_lock;

/* journalling filesystem info */
    void *journal_info;
};

#define TASK_RUNNING        0 //不是表示正在运行,而是表示可以被调用
#define TASK_INTERRUPTIBLE    1
#define TASK_UNINTERRUPTIBLE    2
#define TASK_ZOMBIE        4
#define TASK_STOPPED        8 //对应于task_struct中的state,进程运行状态


//对应task_struct的flag
#define PF_ALIGNWARN    0x00000001    /* Print alignment warning msgs */
                    /* Not implemented yet, only for 486*/
#define PF_STARTING    0x00000002    /* being created */
#define PF_EXITING    0x00000004    /* getting shut down */
#define PF_FORKNOEXEC    0x00000040    /* forked but didn't exec */
#define PF_SUPERPRIV    0x00000100    /* used super-user privileges */
#define PF_DUMPCORE    0x00000200    /* dumped core */
#define PF_SIGNALED    0x00000400    /* killed by a signal */
#define PF_MEMALLOC    0x00000800    /* Allocating memory */
#define PF_MEMDIE      0x00001000       /* Killed for out-of-memory */
#define PF_FREE_PAGES    0x00002000    /* per process page freeing */
#define PF_NOIO        0x00004000    /* avoid generating further I/O */
#define PF_FSTRANS    0x00008000    /* inside a filesystem transaction */

#define PF_USEDFPU    0x00100000    /* task used FPU this quantum (SMP) */

//进程的个性化信息
enum {
    MMAP_PAGE_ZERO =    0x0100000,
    ADDR_LIMIT_32BIT =    0x0800000,
    SHORT_INODE =        0x1000000,
    WHOLE_SECONDS =        0x2000000,
    STICKY_TIMEOUTS    =    0x4000000,
    ADDR_LIMIT_3GB =    0x8000000,
};

/*
 * Personality types.
 *
 * These go in the low byte.  Avoid using the top bit, it will
 * conflict with error returns.
 */
enum {
    PER_LINUX =        0x0000,
    PER_LINUX_32BIT =    0x0000 | ADDR_LIMIT_32BIT,
    PER_SVR4 =        0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
    PER_SVR3 =        0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
    PER_SCOSVR3 =        0x0003 | STICKY_TIMEOUTS |
                     WHOLE_SECONDS | SHORT_INODE,
    PER_OSR5 =        0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS,
    PER_WYSEV386 =        0x0004 | STICKY_TIMEOUTS | SHORT_INODE,
    PER_ISCR4 =        0x0005 | STICKY_TIMEOUTS,
    PER_BSD =        0x0006,
    PER_SUNOS =        0x0006 | STICKY_TIMEOUTS,
    PER_XENIX =        0x0007 | STICKY_TIMEOUTS | SHORT_INODE,
    PER_LINUX32 =        0x0008,
    PER_LINUX32_3GB =    0x0008 | ADDR_LIMIT_3GB,
    PER_IRIX32 =        0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */
    PER_IRIXN32 =        0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */
    PER_IRIX64 =        0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */
    PER_RISCOS =        0x000c,
    PER_SOLARIS =        0x000d | STICKY_TIMEOUTS,
    PER_UW7 =        0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
    PER_HPUX =        0x000f,
    PER_OSF4 =        0x0010,             /* OSF/1 v4 */
    PER_MASK =        0x00ff,
};

//进程资源的限制,对应task_struct中的struct rlimit rlim[RLIM_NLIMITS],RLIM_NLIMITS的值是11,代表11项资源,分别是
#define RLIMIT_CPU    0        /* CPU time in ms */
#define RLIMIT_FSIZE    1        /* Maximum filesize */
#define RLIMIT_DATA    2        /* max data size */
#define RLIMIT_STACK    3        /* max stack size */
#define RLIMIT_CORE    4        /* max core file size */
#define RLIMIT_RSS    5        /* max resident set size */
#define RLIMIT_NPROC    6        /* max number of processes */
#define RLIMIT_NOFILE    7        /* max number of open files */
#define RLIMIT_MEMLOCK    8        /* max locked-in-memory address space */
#define RLIMIT_AS    9        /* address space limit */
#define RLIMIT_LOCKS    10        /* maximum file locks held */

【Linux】PCB(进程控制块)--‘task_struct’

操作系统/进程/PCB概念:     操作系统是进行软、硬件管理的软件,操作系统的进行硬件管理时,需要通过驱动程序来进行执行,驱动程序就相当于一个执行者,介于操作系统和硬件之间。操作系统的任务包含进...

Linux进程控制块PCB结构:task_struct 描述

一、task_struct 结构描述 1.进程状态(State) 进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。Linux 中的进程主要有如下状态,如表4.1 所示。 ...

Linux下的进程控制块—task_struct

Linux下的进程控制块     进程:程序的执行就是进程。也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己。进程是资源分配的基本单位,...
  • zw_1510
  • zw_1510
  • 2016年06月09日 13:27
  • 899

Linux下的进程控制块(PCB)task_struct

或许你对于task_struct是感到陌生的,那么你就先要知道task_struct是进程控制块(PCB)在linux下的一个具体的实现就好,如果你不知道什么是进程控制块的话,那就先看进程,然后再一步...

Linux下进程控制块task_struct结构体注释

task_struct结构注释   ==========================   long state 任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止...

Linux(四):Linux中的进程控制块(PCB)—task_struct(部分字段)

进程控制块(PCB)        每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。现在我们全面了解下其中都有哪些信息。 ...

进程控制块PCB结构 task_struct 描述

一、task_struct 结构描述 1.进程状态(State) 进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。Linux 中的进程主要有如下状态,如表4.1 所示。 ...

进程控制块PCB结构 task_struct 描述

本分类下文章大多整理自《深入分析linux内核源代码》一书。如果想深入了解请下载该书,深入理解。 在看此片博文前,如若对操作系统不甚了解的同学,须提前了解相关知识。 首先,我们来了解一下什么叫...

进程控制块PCB结构 task_struct 描述

进程控制块PCB结构 task_struct 描述 分类: linux内核基础2013-09-16 10:46 644人阅读 评论(4) 收藏 举报 进程控制块pcbtask_st...
  • pi9nc
  • pi9nc
  • 2014年04月10日 14:13
  • 6924

进程控制块PCB结构 task_struct 描述

一、task_struct 结构描述 1.进程状态(State) 进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。Linux 中的进程主要有如下状态,如表4.1 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux进程控制块 task_struct
举报原因:
原因补充:

(最多只允许输入30个字)