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

    一 、Linux内核创建一个新进程的过程
    1、操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理。
    2、对应的三个抽象的概念是进程,虚拟内存和文件。其中,操作系统最核心的功能是进程管理。
    3、fork 被调用一次,能够返回两次。在父进程中返回新创建子进程的 pid;在子进程中返回 0
    4、TASK_RUNNING有两个状态,一个是就绪态但是没有运行,另一个是运行态,这两个状态的转换依赖于内核中的调度器。
    TASK_RUNNING处运行态取决于它是否获得了CPU的控制权;如果被内核调度出去,就在等待队列中。
    对于正在运行的进程,调用用户态库函数exit()会陷入内核执行do_exit()进入TASK_ZOMBIE状态。
    5、进程控制块PCB:task_struct
    struct task_struct {
    volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped 进程状态,-1表示不可执行,0表示可执行,大于1表示停止*/
    void stack; //内核堆栈
    atomic_t usage;
    unsigned int flags; /
    per process flags, defined below 进程标识符 * /
    unsigned int ptrace;
    6、Linux中创建进程一共有三个函数:fork,创建子进程 vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。Linux中所有的进程创建都是基于复制式,Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现。然后对子进程做一些特殊的处理。

    do_fork

           long do_fork(unsigned long clone_flags, unsigned long stack_start,
                unsigned long stack_size, int __user *parent_tidptr,
                int __user *child_tidptr)
    clone_flags:子进程创建相关标志,通过此标志可以对父进程的资源进行有选择的复制。
    stack_start:子进程用户态堆栈的地址。
    regs:指向 pt_regs 结构体(当系统发生系统调用时,pt_regs 结构体保存寄存器中的值并按顺序压入内核栈)的指针。
    stack_size:用户态栈的大小,通常是不必要的,总被设置为0。
    parent_tidptr 和 child_tidptr:父进程、子进程用户态下 pid 地址。
    

    其主要作用为:调用copy_process,将当期进程复制一份出来为子进程,并且为子进程设置相应地上下文信息。初始化vfork的完成处理信息(如果是vfork调用)调用wake_up_new_task,将子进程放入调度器的队列中,此时的子进程就可以被调度进程选中,得以运行。如果是vfork调用,需要阻塞父进程,知道子进程执行exec。
    copy_process 复制父进程的所有信息给子进程,调用 dup_task_struct 复制当前的 task_struct,进行信息检查、初始化、把进程状态设置为 TASK_RUNNING,调用 copy_thread 初始化子进程内核栈,设置子进程pid。
    dup_task_struct中为子进程分配了新的堆栈。
    copy_thread系统调用函数完成赋值功能。
    二、实验
    1.添加命令

    2、打开gdb调试

    3、设置断点

    4、do_fork系统内核调用

    5、copy_process复制信息

    6、copy_thread系统调用赋值

    总结:
    本章深入了解了系统创建进程的过程,使用fork,vfork,clone等调用创建进程,都是通过调用do_fork来实现的。
    整体系统调用嵌套顺序:Sys_clone , Do_fork, Copy_process, Dup_talk_struct, Copy_thread, Ret_from_fork.
    copy_thread中将子进程的ip设置为ret_form_fork的首地址,所以子进程是从ret_form_fork开始执行的。

  • 相关阅读:
    C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()
    B树、B-树、B+树、B*树详解
    C# Volatile 类
    volatile(C# 参考)
    C#中volatile的用法
    C#编程总结(六)异步编程
    C#编程总结(五)多线程带给我们的一些思考
    C#编程总结(三)线程同步
    C#编程总结(二)多线程基础
    C#编程总结(一)序列化
  • 原文地址:https://www.cnblogs.com/20189210mujian/p/10017672.html
Copyright © 2011-2022 走看看