fork和vfork函数介绍

fork

在Linux下如果要创建新的进程,可以调用fork函数,这个函数会通过复制当前进程来创建新进程。子进程会复制父进程的页表而共享父进程的内存,使用写时复制机制,只有当任一个程序要更改内存数据时,操作系统才会复制对应的内存页。因此fork函数的执行效率还是比较高的。

x86保护模式采用二级页面映射,一级页表每项映射4MB内存,二级页表每项映射4KB内存。每个页表项占用4B内存,一级页表大小为进程使用虚拟内存的1/1000000,二级页表为1/1000。对一个使用1GB虚拟内存的程序来说,其页表大小约为1MB。

因为fork之后一般会调用exec族函数要执行新程序,其页表将被丢弃,那么fork时复制页表就毫无意义。页表复制不光是复制页表占用的内存,也会涉及内存分配(页表本身要占用内存)、设置页属性等工作。如果一个大程序(假设页表也很大)要调用一个小程序,实际上是非常不划算的。

 

vfork

vfork函数和fork函数的区别是它不复制页表,其使用前提是必须在vfork之后紧接着调用exec族函数执行新程序。在一些对性能要求比较高的场合,这是非常有用的。父进程会在调用vfork时被阻塞,直到子进程成功调用execl或退出才返回。在vfork之后、exec之前,子进程和父进程共享内存空间且没有任何保护,如果子进程要进行其他操作(如修改全局数据),那是非常危险的。

如果exec函数成功执行,那么函数不会返回;如果执行失败(如找不到程序文件等)则会返回并继续往下执行,这时最妥善的做法是退出子进程。不可以调用exit函数来退出,而只能调用_exit。两者的区别是exit函数可能会做很多清理工作(如释构全局对象等),而_exit会马上退出。别忘了两个进程是共享内存的,子进程把父进程的资源清理之后,会导致父进程执行错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值