linux初探

首页

应用服务器

Linux技巧

中文文档

Linux初级

服务器源代码

命令详解

Linux技术应用

Linux安全应用

Linux业界新闻

UniX技术文章

Linux编程与内核

Linux数据库

Linux服务器

Linux安装指导

Linux论坛

首页>>Linux编程与内核>>文章正文

linux进程介绍之fork vs vfork

在fork之后,子进程和父进程都会继续执行fork调用之后的指令。子进程是父进程的副本。它将获得父进程的数据空间,堆和栈的副本,这些都是副本,父子进程并不共享这部分的内存。也就是说,子进程对父进程中的同名变量进行修改并不会影响其在父进程中的值。但是父子进程又共享一些东西,简单说来就是程序的正文段。正文段存放着由cpu执行的机器指令,通常是read-only的。

  由于在fork之后我们常常都是跟个exec在后面,所以为了提高效率,很多的实现并不完全复制数据段和堆、栈,而是采用写时复制,有点类似于某些cache与内存数据的同步方法。

  另一种提高效率的方法就是使用vfork,vfork最早起源于2.9BSD,它与fork的不同就在于它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec.vfork出来的子进程是在父进程的空间中运行的,它的存在就是为了exec调用,所以它不需要复制这些东西,因为复制了也没有用。如果这时子进程修改了某个变量,这将影响到父进程。

  vfork与fork的另一区别是:vfork保证子进程先运行,在它调用exec或exit后父进程才可能调度运行。而fork的父子进程运行顺序是不定的,它取决于内核的调度算法。

  所以,fork的时候,程序代码被复用了——我指的程序代码就是由cpu执行的机器指令部分,这与有多少个进程在运行无关,即使是频繁执行的程序在存储器中也只需一个副本,而且它在执行期可能是read-only的。当然,如果你exec了,那就是另一码事了。

  另外,父进程中的数据空间和堆、栈可能会产生副本,具体情况要看你使用的是vfork还是fork.fork会产生副本,而vfork则共享这部分内存。

相关文章

·在SuSE10.0下安装qemu
·PHP执行root命令
·请大虾帮忙解释一下
·Linux学习之GCC从这开始
·LINUX学习之一 GCC学习参数详解
·第一个简单的shell工具
·java 类型提升的约定
·在开源Java下生存
·Linux底层开发之四书五经

热门文章

·C++中控制Windows关机的实用
·C++继承性应用实例 日期和时
·C++类型转换时定义非成员函数
·从模板中分离出参数无关的代
·C++中用函数模板实现和优化抽
·用C++ Builder检测Windows的
·用C++ Builder来定制系统菜单
·C++语言代码检查工具PC-Lint
·用C语言实现常见的三种中文内
·用C++ Builder开发多层数据库

Copyright@2005 www.linuxGoo.com All Right Reserved