fork和vfork的区别

本文对比了vfork与fork两种进程创建方式。vfork使子进程与父进程共享虚拟及物理地址空间,父进程在子进程调用exec或exit前被阻塞;而fork则在必要时为子进程分配独立的物理地址空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前文中我们已经介绍了父子进程进行fork时的读时共享 写时复制操作( Linux 进程共享(读时共享 写时复制)是什么.)。现在我们进一步介绍一下vfork并且介绍fork与vfork的区别。

1. 引入vfork

在了解过fork的读时共享 写时复制操作后我们知道,复制出的子进程拥有自己的虚拟空间,但是物理空间是与父进程共享的,直到父子进程对数据进行更改时,再为子进程相应的段分配物理空间。

vfork则直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间。

vfork系统调用不同于fork,用vfork创建的子进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改同样为父进程所见。但是用 vfork创建子进程后,父进程会被阻塞直到子进程调用exec或exit。这样的好处是在子进程被创建后仅仅是为了调用exec执行另一个程序时,因为它就不会对父进程的地址空间有任何引用,所以对地址空间的复制是多余的,通过vfork可以减少不必要的开销。

在这里插入图片描述

2. fork()和vfork()的区别

  1. fork():子进程拷贝父进程的数据段,代码段
    vfork():子进程与父进程共享数据段

  2. fork() 父子进程的执行次序不确定
    vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
    或exit 之后父进程才可能被调度运行。

  3. vfork() 保证子进程先运行,在它调用exec()或exit()之后父进程才可能被调度运行。如果在
    调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

参考文章:
1. fork与vfork的区别.
2. 浅析fork()和底层实现.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值