分析Linux内核创建一个新进程的过程
一.实验原理
1.进程的定义
进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。
2.进程与程序的区别
程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念。
进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。
3.linux系统中进程的表示
在linux系统中,进程由一个叫task_struct的结构体描述,也就是说linux中的每个进程对应一个task_struct结构体。该结构体记录了进程的一切。下面我们来看看它的核心字段。
struct task_struct
{
//这个是进程的运行状态,-1代表不可运行,0代表可运行,>0代表已经停止。
volatile long state;
/*
flags是进程当前的状态标志,具体如下:
0x0000 0002表示进程正在被创建
0x0000 0004表示进程正准备退出
0x0000 0040表示此进程被fork出,但是并没有执行exec
0x0000 0400表示此进程由于其他进程发送相关信号而被杀死
*/
unsigned int flags;
//表示此进程的运行优先级
unsigned int rt_priority;
//该结构体记录了进程内存使用的相关情况
struct mm_struct *mm;
//进程号,是进程的唯一标识
pid_t pid;
//进程组号
pid_t tgid;
//real_parent是该进程的"亲生父亲",不管其是否被"寄养"
struct task_struct *real_parent;
//parent是该进程现在的父进程,有可能是"继父"
struct task_struct *parent;
//这里child