Linux基础 | fork()


前言

Liunx中fork用来产生一个子进程。

一、进程是什么

在这里插入图片描述

二、操作系统如何管理进程

在这里插入图片描述
pcb又叫进程管理块,其中有一个Pid唯一标识一个进程,并通过链表的结构将进程串接起来。

三、fork

在这里插入图片描述
其父进程的返回值为子进程的PID,子进程的返回值为0;

四、写时拷贝

传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork()使用写时拷贝(copy-on-write) 页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写人的时候才进行,在此之前,是以只读方式共享这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。

五、常考面试题目

题目1

在这里插入图片描述
输出:
在这里插入图片描述

题目2

在这里插入图片描述
输出
在这里插入图片描述

总结

fork进行复制时,是把父进程的所有资源都进行了复制,这也是fork的主要开销(写时拷贝除外),需要注意的是如果在缓冲区有数据时也一并进行复制,例如当父进程执行printf“A“以后再进行复制时,子进程的缓冲区也会有相应的"A"存在。换句话说,fork是以进程为单位进行复制的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值