日期:2014-05-16 浏览次数:20903 次
本文将介绍linux下创建进程的过程,不同于其他操作系统,linux创建进程的实现方式有自己的显著特点,具体的实现代码可以在kernel/fork.c中找到。
linux没有线程和进程的区别,但是父进程在创建子进程时,可以根据参数标志让子进程选择性的继承父进程的资源;如果指定子进程继承父进程的地址空间、打开的文件、文件系统、信号量等资源,那么此时的子进程就相当于父进程的“线程”。虽然linux不直接提供线程,但是通过参数标志的方式间接提供被称为“轻量级进程”的线程,显得更加灵活和简单。
此外,由于采用了写时拷贝技术,避免了大量页的拷贝操作,所以linux下创建进程的代价很小。
进程创建的系统调用接口有fork()、vfork()、clone();创建内核进程的接口是kernel_thread()。这些接口函数最终都是调用do_fork()实现具体的进程创建工作,区别在于参数标志不同。
fork()没有设置参数标志,相当于指定了默认参数标志;vfork()设置了CLONE_VFORK、CLONE_VM参数标志,指定父进程共享地址空间(注意与写时拷贝的区别),且子进程创建完成后,父进程睡眠,子进程优先运行;子进程运行完毕后通知父进程继续运行,由于写时拷贝技术的发明,vfork()的优点已经不是很明显了;clone()原型声明中给出了参数标志clone_flags