------------分析Linux内核创建一个新进程的过程--------------
这次实验要详细分析Linux内核创建新进程的过程。那么我们应该先明确,一个进程在Linux内核中是怎样的。那么就是要知道如下的几个知识。
进程(Process)
系统进行资源分配和调度的基本单位,一个进程是一个程序的运行实例。
进程描述符(task_struct)
用来描述进程的数据结构,可以理解为进程的属性。比如进程的状态、进程的标识(PID)等,都被封装在了进程描述符这个数据结构中,该数据结构被定义为task_struct
进程控制块(PCB)
是操作系统核心中一种数据结构,主要表示进程状态。在第一次实验就已经接触过了。
进程状态
开始、就绪、运行、阻塞、终止。
众所周知,创建一个进程是通过fork()实行的。实际上在Linux中创建进程一共有三个函数:
1.fork,创建子进程。
2. vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。
3. clone,主要用于创建线程。这里值得注意的是,Linux中得线程是通过模拟进程实现的,较新的内核使用的线程库一般都是NPTL。
那么我们现在来看看这三个函数在创建新进程时发生了。查看源代码,fork()通过触发0x80中断,陷入内核来提供调用。
代码精简后如下:
可以看出,无论是哪种方法创建新进程,最终都是通过do_fork()实现的!!!