Linux进程管理之task_struct

来源:互联网 发布:淘宝男装关键词优化 编辑:程序博客网 时间:2024/06/07 13:07

进程和进程块
什么是进程?
进程就是一个正在执行的程序
进程就是正在计算机上执行的程序实例
能分配给处理器并由处理器执行的实体
什么是进程控制块?
当一个程序被加载到内存中会为它分配一个进程控制块,这个进程控制块(PCB)由操作系统创建和管理.在Linux下PCB就是一个task_struct的结构体,这个结构体就是用来描述进程的信息。操作系统是如何管理所有进程呢,就是通过每个进程的描述信息(也就是一个个描述每个进程信息的结构体)用某种数据结构将所有的结构体链接起来进行管理。
简化的进程控制块里有:
1、标识符:跟这个进程唯一相关的标识符
2、状态:如果进程正在执行,那么进程处于运行态
3、优先级:相对于其他进程的优先级
4、内存指针:包括程序代码和进程相关的数据指针,还有和其他进程共享内存块指针
5、上下文数据:进程执行时处理器的寄存器中的数据
6、I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
7、记账信息:可能包括处理器时间总和,使用的时钟数总和、时间限制、记账号
….
那task_struct这个结构体的内容究竟是什么?

struct task_struct {        volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */        void *stack;        atomic_t usage;        unsigned int flags;    //每个进程的标记        int lock_depth;      //锁的深度        int prio, static_prio, normal_prio;        unsigned int rt_priority;        const struct sched_class *sched_class;        struct sched_entity se;        struct sched_rt_entity rt;        unsigned int policy;        cpumask_t cpus_allowed;        struct list_head tasks;        struct plist_node pushable_tasks;        struct mm_struct *mm, *active_mm; //进程内存信息        //任务状态        int exit_state;        int exit_code, exit_signal;        int pdeath_signal;          unsigned int personality;        unsigned did_exec:1;        unsigned in_execve:1;          unsigned in_iowait:1;        unsigned sched_reset_on_fork:1;//恢复到默认优先级        pid_t pid; //进程标识符        pid_t tgid;        //表示进程的亲属关系成员        struct task_struct *real_parent; //指向其父进程,如果创建它的的进程不存在,则指向pid为1的init进程        struct task_struct *parent; //指向其父进程,当它终止时,必须向它的父进程发送信号,它的值通常和real_parent相同        struct list_head children; //表示链表的头部,链表中所有的元素都是它的子进程        struct list_head sibling;  //用于把当前进程插入到兄弟链中        struct task_struct *group_leader; //指向其所在进程的领头进程        //进程调度        unsigned int ptrace;        struct list_head ptraced;        struct list_head ptrace_entry;        unsigned long ptrace_message;        siginfo_t *last_siginfo;        /* PID/PID hash table linkage. */        struct pid_link pids[PIDTYPE_MAX];        struct list_head thread_group;        struct completion *vfork_done;         //供fork()使用        int __user *set_child_tid;                  int __user *clear_child_tid;               //cpu时间信息        cputime_t utime, stime, utimescaled, stimescaled;        cputime_t gtime;        cputime_t prev_utime, prev_stime;        unsigned long nvcsw, nivcsw;  //上下文切换项        struct timespec start_time;                     struct timespec real_start_time;                int link_count, total_link_count;//文件系统信息        struct thread_struct thread;//进程的cpu状态,切换时要保存到停止进程的task_struct        struct fs_struct *fs;//文件系统信息        struct files_struct *files;//打开文件信息         //信号句柄        struct signal_struct *signal;        struct sighand_struct *sighand;        sigset_t blocked, real_blocked;        sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */        struct sigpending pending;        unsigned long sas_ss_sp;        size_t sas_ss_size;        udit_context;        seccomp_t seccomp;        //线程组跟踪        u32 parent_exec_id;        u32 self_exec_id;        //保护数据结构        spinlock_t alloc_lock;        spinlock_t pi_lock;        void *journal_info;日志文件系统信息        struct bio *bio_list, **bio_tail;//堆块设备信息        //虚拟机状态        struct reclaim_state *reclaim_state;        struct reclaim_state *reclaim_state;        struct backing_dev_info *backing_dev_info;        struct io_context *io_context;        struct task_io_accounting ioac;};
1 0
原创粉丝点击