2021-2022-1 20212820《Linux内核原理与分析》第七周作业

分析 Linux 内核创建一个新进程的过程

阅读理解 task_struct 数据结构 https://github.com/torvalds/linux/blob/v3.18-rc6/include/linux/sched.h#L1235;

  • state:进程状态
  • stack:内核堆栈
  • tasks:进程链表
  • mm:内存管理
  • task_state:任务的状态
  • pid:进程PID
  • real_parent children:进程的父子关系
  • files:文件描述符列表
  • signal:信号处理相关
  • splice_pipe:管道相关
  • 下图是struct task_struct的结构关系

2021-2022-1 20212820《Linux内核原理与分析》第七周作业_第1张图片

  • 如下代码摘录了struct task_struct数据结构的一部分:
struct task_struct {
    volatile long state;        //说明了该进程是否可以执行,还是可中断等信息
    unsigned long flags;        //进程号,在调用fork()时给出
    int sigpending;             //进程上是否有待处理的信号
    mm_segment_t addr_limit;    //进程地址空间,区分内核进程与普通进程在内存存放的位置不同
                                //0-0xBFFFFFFF for user-thead
                                //0-0xFFFFFFFF for kernel-thread
    //调度标志,表示该进程是否需要重新调度,若非0,则当从内核态返回到用户态,会发生调度
    volatile long need_resched;
    int lock_depth;             //锁深度
    long nice;                  //进程的基本时间片
    //进程的调度策略,有三种,实时进程:SCHED_FIFO,SCHED_RR, 分时进程:SCHED_OTHER
    unsigned long policy;
    struct mm_struct *mm;       //进程内存管理信息
    int processor;
    //若进程不在任何CPU上运行, cpus_runnable 的值是0,否则是1 这个值在运行队列被锁时更新
    unsigned long cpus_runnable, cpus_allowed;
    struct list_head run_list;  //指向运行队列的指针
    unsigned long sleep_time;   //进程的睡眠时间
    //用于将系统中所有的进程连成一个双向循环链表, 其根是init_task
    struct task_struct *next_task, *prev_task;
    struct mm_struct *active_mm;
    struct list_head local_pages;       //指向本地页面      
    unsigned int allocation_order, nr_local_pages;
    struct linux_binfmt *binfmt;        //进程所运行的可执行文件的格式
    int exit_code, exit_signal;
    int pdeath_signal;                  //父进程终止是向子进程发送的信号
    unsigned long personality;

    int did_exec:1; 
    pid_t pid;                          //进程标识符,用来代表一个进程
    pid_t pgrp;                         //进程组标识,表示进程所属的进程组
    pid_t tty_old_pgrp;                 //进程控制终端所在的组标识
    pid_t session;                      //进程的会话标识
    pid_t tgid;
    int leader;                         //表示进程是否为会话主管
    struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;
    struct list_head thread_group;      //线程链表
    struct task_struct *pidhash_

你可能感兴趣的:(linux,运维,服务器)