fork函数,进程等待,进程终止,写时拷贝

1.fork函数介绍

fork之前父进程独立执行,只有父进程没有子进程,fork之后,父子进程二个执行流分别执行,也就是说fork之后就有二个进程
进程具有独立性,代码和数据必须独立的,代码只能被读取,因为会产生写时拷贝
除了这些fork之后代码共享,那么fork之后,是不是只有fork之后的代码是被父子进程共享的,答案不是:fork之后,父子共享所有代码

但是子进程执行的后续代码 != 共享的所有代码,只不过子进程只能从这里开始执行

2.fork之后,操作系统做了什么?

首先我们知道
进程 = 内核的进程数据结构 + 进程的代码和数据

创建子进程的内核数据(struct task_struct + struct mm_struct + 页表 )+ 代码继承父进程,数据以写时拷贝的方式,来进行共享
这样子完成了独立性,因为这种办法,哪怕时子进程崩了,父进程也能单独运行

3.写时拷贝(深浅拷贝)

通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本
写时拷贝本身就有操作系统完成的

在这里插入图片描述

为什么要写时拷贝?

我们可以创建子进程的时候,就把数据分开,不行吗?
答案是可以但是
1.父进程的数据,子进程不一定全用,即使全用,也不一定全部写入,所以会有浪费空间的可能
2. 最理想的情况,只有会被父子修改的数据,进行分离拷贝,不需要修改的共享,但是从技术角度复杂
3. 如果fork的时候,就无脑拷贝数据给子进程,无疑会增加fork的成本(内存和时间)

4.fork失败的原因

1.系统有太多进程
2.实际用户的进程超过了限制

模拟进程创建失败代码

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
   
  for(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值