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,这是子进程的起点,运行,子进程可以执行并显示在终端中。
总结来讲,进程的创建过程大致是赋值进程描述符一一复制其他进程资源(采用写时复制技术)分配子进程的内核堆栈并对内核堆栈关键信息进行初始化

posted @ 2020-11-16 20:50  逐北  阅读(77)  评论(0编辑  收藏  举报