• 2020-2021-1 20209321 《Linux内核原理与分析》第七周作业


    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <进程的描述,进程的创建,跟踪分析进程创建的过程,总结>
    作业正文 ... 本博客链接

    进程的描述和创建

    1.进程的描述

    • 操作系统内核三大管理功能:进程管理,内存管理和文件系统,对应操作系统原理最重要的3个概念:进程,虚拟内存和文件。其中,操作系统内核最核心的功能是进程管理。

    • 进程有就绪态,运行态,阻塞态3种基本状态。

    • 在Linux内核中用一个数据结构struct task_struct来描述进程,struct task_struct的数据结构非常庞大,包含进程的状态,进程双向链表的管理,以及控制台tty,文件系统fs的描述,进程打开文件的文件描述符files,内存管理的描述mm,还有进程间通信的信号signal的描述等。

    2.进程的创建

    • (1)进程的创建是非常复杂的,init_task(0号进程)通过kernel_thread创建了两个内核线程:一个是kernel_init,最终把用户态的进程init给启动起来;另一个是kthread内核线程。kthreadd内核线程是所有内核线程的祖先,负责管理所有内核线程。kthreadd创建进程的过程和shell命令行下启动一个进程时创建进程的过程在本质上是一样的,都要通过复制父进程来创建一个子进程。在系统启动时,除了0号进程的初始化过程是手工编码创建的之外,1号init进程的创建实际上是复制0号进程,根据1号进程的需要修改了进程pid,然后再加载一个init可执行程序。同样的,2号kthreadd内核线程也是通过复制0号进程来创建的。

    • (2)fork,vfork和clone这3个系统调用和kernel_thread内核函数都可以创建一个新进程,而且都是通过do_fork函数来创建进程的,只不过传递的参数不同。

    • (3)do_fork的参数:

    • i: do_fork主要完成了调用copy_process复制父进程信息、获得pid、调用wake_ip_new_task将子进程加入调度器队列等待获得分配CPU资源运行、通过clone_flags标志做一些辅助工作。

    • ii: copy_process函数主要完成了调用dup_task_struct复制当前进程(父进程)描述符task_struct、信息检查、初始化、复制所有其他进程资源、调用copy_thread初始化子进程内核栈、设置子进程pid等。其中最关键的就是dup_task_struct复制当前进程描述符task_struct和copy_thread初始化子进程内核栈。

    • iii: dup_task_struct函数中为子进程分配好了内核栈,copy_thread完成内核栈关键信息的初始化。

    3.跟踪分析进程创建的过程

    在MenuOS里面增加一个命令fork

    启动gdb准备跟踪调试内核程序

    在sys_clone,do_fork,dup_task_struct,copy_process,copy_thread,ret_from_fork处设置断点

    执行“C”,依次对断点进行跟踪

    4.总结

    进程的创建过程大致是复制进程描述符、一一复制其它进程资源(采用写时复制技术)、分配子进程的内核堆栈并对内核堆栈关键信息进行初始化。

  • 相关阅读:
    Jersey Politics
    网络流——最小费用最大流
    网络流——最大流Dinic算法
    【洛谷2756】飞行员配对方案问题(二分图匹配,网络流24题)
    状压dp入门
    2018九江市赛
    [CQOI2007]余数求和
    CSAPC2008 skyline
    [ZJOI2009]函数 题解
    由不定方程想到的——数论选讲
  • 原文地址:https://www.cnblogs.com/traceurli/p/14012684.html
Copyright © 2020-2023  润新知