第六章 进程的描述和进程的创建
(一)进程的描述
1、OS的三大管理功能:(1)进程管理(进程)(2)内存管理(虚拟内存)(3)文件系统(文件)
2、进程的描述:进程控制块PCB
3、在Linux内核中,struct task_struct描述进程,其中的变量state为进程状态,stack是堆栈。结构关系:进程状态,进程双向链表的管理,控制台tty,文件系统fs的描述,进程打开文件的文件描述符:files、内存管理的描述mm,进程间通讯的信号signal的描述等。
4、Linux进程的状态与操作系统原理中的进程状态的主要区别在于,Linux内核中的就绪态和运行态都
被称作TASK_RUNNING,在阻塞态的进程分为两种,一种是TASK_INTERUPTIBLE,可以被信号以及wake_up()唤醒,另一种是TASK_UNINTERUPTIBLE只能被wake_up()唤醒。i
5、进程的标识符PID,在进程描述符中用pid和tgid标识进程。
6、双向链表struct list_head tasks用于管理进程数据结构。
(二)进程的创建
1、init_task是第一个进程(0号进程)的进程描述结构体变量,它的初始化通过硬编码的方式固定下来,而其他进程的初始化都是通过do_fork复制父进程的方式初始化的。
2、内存管理相关代码。
mm和active_mm是和进程地址空间、内存管理相关的数据结构指针,包含多个数据段,代码段,堆栈段。
3、进程之间的父子、兄弟关系
struct task_struct数据结构中记录当前进程的父进程real_parent、parent,记录当前进程的子进程的是双向链表struct list_head children,记录当前进程的兄弟进程的是双向链表struct list_head sibling。父子兄弟之间复杂的链表关系都通过指针或者双向链表关联起来。
4、保存进程上下文中CPU相关一些状态信息的数据结构
struct thread_struct保存进程上下文中CPU相关的一些状态信息的数据结构。其中最重要的是sp和ip,在x86-32位系统中,sp用来保存进程上下文中的ESP寄存器状态,ip用来保存进程上下文中的EIP机寄存器状态。
5、进程的创建和过程分析
进程的创建大概就是把当前进程的描述符等相关进程资源复制一份,产生一个子进程,根据子进程的需要对复制的进程描述符做一些修改,然后将创建好的子进程放入运行队列(对应操作系统中的就绪队列)。
(三)分析进程创建过程
给menuOS添加断点,分别在sys_clone do_fork dup_task_struct copy_process``copy_thread处
在命令行中输入fork发现停在sys_clone处,说明系统调用函数是sys_clone继续执行会停在do_fork中