第六章
进程的描述和进程的创建
学习笔记
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函数的执行速度并不快。