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


    第六章

    进程的描述和进程的创建

    学习笔记

    1.操作系统的三大管理功能:

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

    2.操作系统最核心的功能是进程管理。

    3.为了管理进程,内核要描述进程的结构,也成为进程描述符,进程描述符提供了进程相关的所有信息。

    • task_struct数据结构非常庞大

    4.就绪态和运行态都是TASK_RUNNING

    5.操作系统原理中的进程有就绪态、运行态、阻塞态这三种基本状态,与实际的Linux内核管理的进程状态不同

    • Linux内核中是否在运行取决于它有没有获得CPU的控制权
    • 一个正在运行的进程在等待特定的事件或资源时会进入阻塞态。
    • 阻塞态分为两种TASK_INTERRUPTIBLE(可以被信号和wake_up()唤醒)和TASK_UNINTERRUPTIBLE(只能被wake_up()唤醒)。

    6.进程的标识符PID也很重要,在进程描述中用pid和tgid标识进程。

    7.struct list_head tasks 用于管理进程数据结构的双向链表

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

    实验

    • 删掉menu,克隆一份新的,把test.cgei覆盖掉。

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

    • 在MenuOS中执行fork,就会发现fork函数停在了父进程中

    • 继续执行 停在了do_fork的位置
    • 继续追踪

    • 在copy_thread中得到初始化

    总结

    Linux中,fork、vfork和clone三个系统调用都是通过调用do_fork来实现进程的创建,而fork()系统调用产生的子进程在系统调用处理过程中从ret_from_fork处开始执行。fork会产生父子进程,在父进程中,返回值是子进程的进程号;在子进程中,返回值为0。因此可通过返回值来判断当前进程是父进程还是子进程。使用fork函数得到的子进程是父进程的一个复制品,它从父进程处复制了整个进程的地址空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进程组号,当前工作目录,根目录,资源限制,控制终端等。而子进程所独有的只是它的进程号,资源使用和计时器等。可以看出,使用fork函数的代价是很大的,它复制了父进程中的代码段,数据段和堆栈段里的大部分内容,使得fork函数的执行速度并不快。

  • 相关阅读:
    BZOJ3403: [Usaco2009 Open]Cow Line 直线上的牛
    lintcode入门篇三
    lintcode入门篇二
    lintcode入门篇一
    matplotlib
    Pandas
    Numpy
    缓存
    Django性能优化的几种方法
    python总结十一
  • 原文地址:https://www.cnblogs.com/lsqz/p/11743171.html
Copyright © 2020-2023  润新知