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

    进程的描述和进程的创建

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 在MenuOS中增加命令fork、跟踪分析进程创建的过程
    作业正文 https://www.cnblogs.com/TracerElena/p/14012739.html

    在MenuOS中增加命令fork

    在shell1中执行以下命令,向MenuOS中增加fork命令以创建进程:

    cd ~/LinuxKernel
    rm menu -rf
    git clone https://github.com/mengning/menu.git
    cd menu 
    mv test_fork.c test.c
    make rootfs  
    

    MenuOS运行效果如下,可以看到已经增加了一条创建进程的fork命令。

    跟踪分析进程创建的过程

    在shell2中进行gdb调试:

    gdb
    file linux-3.18.6/vmlinux
    target remote:1234
    

    在sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork等处设置断点:

    b sys_clone
    b do_fork
    b dup_task_struct
    b copy_process
    b copy_thread
    b ret_from_fork
    

    设置完断点后执行,停在了do_fork处

    继续执行,找到其余断点

    总结

    1. 操作系统内核实现操作系统的三大管理功能:
    • 进程管理
    • 内存管理
    • 文件系统
    1. 进程的三种基本状态:
    • 就绪态
    • 运行态
    • 阻塞态

    在Linux内核中,当进程是TASK_RUNNING状态时,它是可运行的,处于就绪态。当进程获得CPU的控制权,在CPU中实际执行时,它处于运行态。当进程被内核调度出去,在等待队列里就是就绪态。一个正在运行的进程在等待特定的事件或资源时会进入阻塞态。

    1. do_fork函数的参数:
    • clone_flags:子进程创建相关标志,通过此标志可以对父进程的资源进行有选择的复制
    • stack_start:子进程用户态堆栈的地址
    • regs:指向pt_regs结构体的指针
    • stack_size:用户态栈的大小,通常是不必要的,总被设置为0
    • parent_tidptr和child_tidptr:父进程子进程用户态下的pid地址
    1. 创建一个进程是复制当前进程的信息,即fork一个进程就是创建了一个新进程。父进程和子进程的绝大部分信息是完全一样的,但是pid的值和内核堆栈等信息是不能一样的。在fork一个子进程的过程中,复制父进程的资源时采用Copy On Write技术,不需要修改进程资源,父子进程共享内存存储空间。
  • 相关阅读:
    ndarray转PIL
    215. 数组中的第K个最大元素
    pytorch的分布式
    剑指 Offer 06. 从尾到头打印链表
    最长公共子序列
    剑指 Offer 57
    剑指 Offer 59
    剑指 Offer 48. 最长不含重复字符的子字符串
    Python线程池
    Python 常用内置函数
  • 原文地址:https://www.cnblogs.com/TracerElena/p/14012739.html
Copyright © 2011-2022 走看看