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

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <gdb跟踪调用fork>
    作业正文 https://www.cnblogs.com/hyuxin/p/14012994.html

    实验六

    一、gdb跟踪调用fork函数的过程

    1.先删除原有的menu,再在github上克隆一份新的,使用mv把test.c覆盖掉,然后执行编译

    2.查看help可以看到多了fork命令

    3.跟上次的实验一样,用如下方式调试内核

    cd .. #返回到LinuxKernel目录下
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s 
    


    4.然后在sys_clone,do_fork,dup_task_struct,copy_process,copy_thread和ret_from_fork设置断点:

    5.在gdb中continue执行到断点do_fork处

    6.然后执行命令n一直往下调试,可以看到执行到了copy_thread处

    二、fork函数分析

    fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。当使用fork()系统调用来创建一个新进程时,新进程的状态是TASK_RUNNING(就绪态,但是没有在运行)。当调度器选择这个新创建的进程运行时,新创建的进程就切换到运行态,它也是TASK_RUNNING。

    三、总结

    Linux系统中,进程的状态在就绪和运行状态都是task_running状态。是否运行取决于是否在CPU的时序上运行,跟windows中类似,当等待事件发生或者资源分配等,进程变为阻塞状态,事件发生或者等待的资源分配后转为就绪状态。进程都是用一个双向循环链表的结构链接起来的。每个进程通过pid标识来区分。第一个进程创建后,当要创建新的进程,先复制父进程的内容,然后修改寄存器、标识符等信息。然后,新 task_struct 结构的地址保存在链表中,而旧进程的 task_struct 结构内容被复制到新进程的 task_struct 结构中。

  • 相关阅读:
    游戏开发中——垂直同步、绘制效率、显示器刷新频率与帧率
    python 异常
    python 多文件知识
    python if,for,while
    python 算术运算
    1.英语单词笔记
    Java import的作用
    java基础点
    Eclipse Java注释模板设置详解
    Java文档注释详解
  • 原文地址:https://www.cnblogs.com/hyuxin/p/14012994.html
Copyright © 2011-2022 走看看