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

  • 相关阅读:
    【POJ 1655】Balancing Act
    【POJ 2631】 Roads in the North
    【洛谷 1002】 过河卒
    【洛谷 3178】树上操作
    【洛谷 1060】开心的金明
    【洛谷 2709】小B的询问
    【洛谷 1972】HH的项链
    JavaSpark-sparkSQL
    java8下spark-streaming结合kafka编程(spark 2.3 kafka 0.10)
    Kafka 使用Java实现数据的生产和消费demo
  • 原文地址:https://www.cnblogs.com/vizen/p/11783804.html
Copyright © 2011-2022 走看看