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

posted @ 2019-11-02 21:29  汪振_20199322  阅读(203)  评论(0)    收藏  举报