父子进程之间在fork后。父子相同处: 全局变量、.data、.bbs、.text、栈、堆、环境变量、用户ID、宿主目录(进程用户家目录)、进程工作目录、信号处理方式等等,即0~3G的用户空间是完全一样的。父子不同处: 1.进程ID   2.fork返回值   3.父进程ID    4.进程运行时间    5.闹钟(定时器)   6.未决信号集

似乎,子进程复制了父进程0-3G用户空间内容,以及父进程的PCB(内核模块在物理内存只有一份),但pid等不同。真的每fork一个子进程都要将父进程的0-3G地址空间完全拷贝一份,然后在映射至物理内存吗?当然不是,父子进程间遵循读时共享写时复制的原则。这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。

读时共享写时复制这一机制是由MMU来实现的。

注意:只有进程空间的各段的内容要发生变化时(子进程或父进程进行写操作时,都会引起复制),才会将父进程的内容复制一份给子进程。在fork之后两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。即父子进程在逻辑上仍然是严格相互独立的两个进程,各自维护各自的参数,只是在物理上实现了读时共享,写时复制。

父子进程一直共享:1. 文件描述符(打开文件的结构体) ,注意不是共享文件描述符本身这个整形数,而是共享同一个文件对应的FILE *结构体指针,其实一个文件打开后只能有一个FILE结构体,因此对于多有的进程都是共享这一个结构体,不仅仅只是父子进程。 2. mmap建立的映射区 (进程间通信详解)。

特别的,fork之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算法。

进程共享(读时共享写时复制)相关推荐

  1. 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

    标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...

  2. 写时拷贝/写时复制技术

    拷贝控制 C++提供两个拷贝控制函数 拷贝构造函数 拷贝赋值运算符重载 例如:String类 class String{public:String(const char* str = NULL);St ...

  3. 【看表情包学Linux】进程创建 | 进程终止 | 分叉函数 fork | 写时拷贝 | 内核数据结构缓冲池 | slab 分派器

    爆笑教程<看表情包学Linux>

  4. 写时复制技术(摘自C语言中文网)

    我们知道了一个进程如何采用请求调页,仅调入包括第一条指令的页面,从而能够很 快开始执行.然而,通过系统调用 fork() 的进程创建最初可以通过使用类似于页面共享的技术,绕过请求调页的需要.这种技术提 ...

  5. linux动态链接库全局变量共享问题DLL共享数据段

    Linux写时拷贝技术(copy-on-write) 进程间是相互独立的,其实完全可以看成A.B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一 ...

  6. Redis的读更新和写更新-如何保证Redis与数据库的数据一致性

    背景 日前面试的时候被问到我们项目里面使用Redis的时候是如何更新缓存的,我的回答是写操作的时候的时候把缓存删了,然后读操作的时候就会读取出来最新的值.面试管继续问:Redis的写时更新和读时更新有 ...

  7. 进程P1、P2、P3共享一个表格F,P1对F只读不写,P2对F只写不读,P3对F先读后写。进程可同时读F,但有进程写时,其他进程不能读和写。

    进程P1.P2.P3共享一个表格F,P1对F只读不写,P2对F只写不读,P3对F先读后写.进程可同时读F,但有进程写时,其他进程不能读和写.要求:(1)正常运行时不能产生死锁.(2)F的并发度要高. ...

  8. c++ fork 进程时 共享内存_因为没答好进程间通信,面试挂了...

    前言 开场小故事 炎炎夏日,张三骑着单车去面试花了 1 小时,一路上汗流浃背. 结果面试过程只花了 5 分钟就结束了,面完的时候,天还是依然是亮的,还得在烈日下奔波 1 小时回去. 面试五分钟,骑车两 ...

  9. c++ fork 进程时 共享内存_linux共享内存mmap

    Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...

最新文章

  1. 高并发场景下缓存的常见问题
  2. 微服务配置中心是干啥的_配置中心微服务器配置
  3. Reveal.js一个用来做WEB演示文稿的框架
  4. 自定义android控件EditText 自定义边框 背景
  5. html5 梵高 星,梵高作品欣赏《星空》
  6. Aescrpts Text Chain for Mac - AE动态文本链排列脚本插件
  7. boost::pool
  8. SpringCloud创建Config Client配置读取
  9. 《算法:C语言实现》——连通性
  10. pytorch torch.ones
  11. 如何写出让人眼前一亮的硬核简历
  12. HDU1293+Java+大整数
  13. ecmall商品列表页排序的完美解决方案
  14. pr视频两边模糊_干货!Pr教程:如何在视频中添加模糊效果?
  15. Redis 菜鸟教程学习笔记- Redis 配置
  16. 2021-08-16
  17. 微信小程序数据添加到云数据库中
  18. python字符串编码及乱码解决方案
  19. 15 个边玩游戏边学编程的网站(包含 Python)
  20. java get和post请求参数设置,Get和Post两种方式向指定地址提交表单

热门文章

  1. How to check bad fix
  2. WPF CanExecuteChanged
  3. Gridview一次更新所有记录
  4. linux算法平台,Linux实时调度算法与测试平台的研究与实现
  5. 会计电算化的过程 实质上是用计算机,会计电算化的过程,实质上是用计算机()的过程。A.单一地替代手工会计操作B.单一地替代对会计进行分...
  6. matlab中求积函数,MATLAB软件及高斯勒让德求积公式MATLAB软件及高斯勒让德求积公式.doc...
  7. mysql 5.7 mirror_Centos7 Docker离线部署Mysql5.7
  8. 定义并调用函数输出 fibonacci 序列_科学网—Zmn-0351 薛问天:再谈数学概念的定义,评新华先生《0345》...
  9. java线程“生产/消费”模型2
  10. C++自动类型推导 : auto 与 decltype 用法