zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199322《Linux内核原理与分析》第七周作业

    本周主要是研究的是Linux下的进程控制

    先回顾一下知识点

    ½ :新生(new):进程新产生中。
    ⅓ :运行(running):正在运行。
    ¼ :等待(wating):等待某事发生,例如等待用户输入完成。
    ⅕ :就绪(ready):排队中,等待CPU。
    ⅙ :退出(terminated):完成运行。
    主要关系如图

    多余过程不再赘述,直接看图

    启动内核(冻结)

    gdb,设置断点,观察

    代码分析

        struct task_struct *p;//创建进程描述符指针
        int trace = 0;
        long nr;//子进程pid
        p = copy_process(clone_flags, stack_start, stack_size,
                 child_tidptr, NULL, trace);//创建子进程的描述符和执行时所需的其他数据结构
        if (!IS_ERR(p)) {//如果copy_process执行成功
            struct completion vfork;//定义完成量
            struct pid *pid;
            pid = get_task_pid(p, PIDTYPE_PID);//获得task结构体中的pid
            nr = pid_vnr(pid);//根据pid结构体中获得进程pid
                    //如果clone_flags包含CLONE_VFORK标志,就将完成量vfork赋值给进程描述符中的vfork_done字段,此处只是对完成量进行初始化
            if (clone_flags & CLONE_VFORK) {
                p->vfork_done = &vfork;
                init_completion(&vfork);
                get_task_struct(p);
            }
    
            wake_up_new_task(p);//将子进程添加到调度器的队列,使之有机会获得CPU
    
            /* forking complete and child started to run, tell ptracer */
                    //如果clone_flags包含CLONE_VFORK标志,就将父进程插入等待队列直到子进程调用exec函数或退出,此处是具体的阻塞
            if (clone_flags & CLONE_VFORK) {
                if (!wait_for_vfork_done(p, &vfork))
                    ptrace_event_pid(PTRACE_EVENT_VFORK_DONE, pid);
            }
    

    总结

    本周修改了cnblogs的样式,另外这周的很多的操作步骤都是上周的,但是依然学习到了一些新的知识。

  • 相关阅读:
    短信平台README.MD
    电子保单README.MD
    数据结构和算法(二)
    学习java数据结构和算法笔记(一)
    删除SVN信息
    工作中比较经常用到的命令
    Eclipse不正常关闭后,解决闪退问题
    文字接口数据捕获tcpdump
    Swagger2和springMVC整合测试
    SpringMybatis 整合JavaWeb
  • 原文地址:https://www.cnblogs.com/vizen/p/11783804.html
Copyright © 2011-2022 走看看