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

    作业信息

    作业课程 2020-2021-1Linux内核原理与分析
    作业要求 2020-2021-1Linux内核原理与分析第七周作业
    作业目标 进程的描述和进程的创建
    作业正文 2020-2021-1 20209322《Linux内核原理与分析》第七周作业

    进程的描述和进程的创建

    一、进程的描述

    1.1操作系统的三大管理功能以及对应的抽象概念:

    • 进程管理
    • 内存管理
    • 文件系统

    1.2Linux进程的状态:

    (1)Linux中进程的状态细分可以分为七种:

    • R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;
    • S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)
    • D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)
    • T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行
    • X死亡状态(dead):该状态是返回状态,在任务列表中看不到;
    • Z僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态;
    • T追踪停止状态(trancing stop)

    (2)在linux下,进程三种主要状态:

    • 就绪态
    • 运行态
    • 阻塞状态

    每种状态将会依据外部条件不断的切换。 刚开始创建的进程叫做就绪态,叫做task_running 当被调用之后,开始运行叫做运行态,也叫做task_running 这两个状态都用了task_runing同一个标志,可理解为可运行状态,是否运行要看时间片等信息。 如果进程终止后进入僵尸状态,最终被回收。 如果等待某件事情将进入阻塞状态。如果被唤醒重新进入就绪态。
    进程状态的转换如下图:

    二、进程的创建

    2.1 Linux中创建进程一共有三个函数:

    • fork,创建子进程。
    • vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。
    • clone,主要用于创建线程。
      Linux中所有的进程创建都是基于复制的方式,Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现。然后对子进程做一些特殊的处理。而Linux中的线程,又是一种特殊的进程。根据代码的分析,do_ fork中,copy_ process管子进程运行的准备,wake_ up_ new_ task作为子进程forking的完成。

    2.2 do_fork处理内容:

    • 调用copy_process,复制父进程信息
    • 获得pid
    • 调用wake_up_new_task,将子进程放入调度器队列等待获得分配CPU资源

    2.3copy_process函数作用

    • 调用dup_task_struct复制当前父进程描述符task_struct
    • 信息检查
    • 初始化
    • 将进程状态设为就绪态
    • 逐一复制其他进程资源
    • 调用copy_thread初始化子进程内核栈
    • 设置子进程pid

    2.4dup_task_struct作用

    • 为子进程分配存储空间
    • 复制父进程描述符task_struct
    • 对子进程thread_info结构初始化

    三、实验

    3.1.更新代码

    删除之前的menu,再通过git克隆一份新的,使用mv把test.c覆盖掉,然后执行 make roofts。

    cd LinuxKernel
    rm -rf menu
    git clone http://github.com/mengning/menu.git
    cd menu
    mv test_fork.c test.c
    

    3.2连接gdb调试

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
    

    使用水平分割,开启新的shell窗口,启动gdb,

    file linux-3.18.6/vmlinux
    target remote:1234
    

    3.3设置断点

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

    3.4调试

    继续运行内核程序,在代码行中输入c,会找到设置的第一个断点do_fork。

    继续调试,找到copy_process() 函数

    继续执行,到断点copy_thread()函数

    四、总结

    本次实验,了解了进程的创建过程,do_fork会调用copy_process来复制父进程的资源给子进程。在copy_process中有各种函数来进行复制初始化工作。完成各项工作之后会执行ret_from_fork,这是子进程的起点,运行,子进程可以执行并显示在终端中。
    总结来讲,进程的创建过程大致是赋值进程描述符一一复制其他进程资源(采用写时复制技术)分配子进程的内核堆栈并对内核堆栈关键信息进行初始化

  • 相关阅读:
    平板涂色
    速算游戏_NOI导刊2011提高(04)
    信息学奥赛一本通——配套刷题网站
    求10000以内n的阶乘
    大整数的因子
    计算2的N次方
    大整数加法
    带余除法
    A/B 高精度
    A*B 高静度
  • 原文地址:https://www.cnblogs.com/Lizhicheng-07/p/13986512.html
Copyright © 2011-2022 走看看