• 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的样式,另外这周的很多的操作步骤都是上周的,但是依然学习到了一些新的知识。

  • 相关阅读:
    Appium环境搭建+cordova
    Appium简单测试用例
    appium常用方法整理
    JAVA+Maven+TestNG搭建接口测试框架及实例
    stm32填坑之旅一
    再度分(tu)析(cao)Egret这个年轻人
    Egret的若干局限
    egret随笔-egret浅入浅出
    一步一步实现AS3拖放组件
    react-native学习笔记——ViewStack组件
  • 原文地址:https://www.cnblogs.com/vizen/p/11783804.html
Copyright © 2020-2023  润新知