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函数的执行速度并不快。

猜你喜欢

转载自www.cnblogs.com/lsqz/p/11743171.html