专栏首页架构说进程fork函数

进程fork函数

验证1 fork会重新拷贝父进程的一份资源

例如 环境变量 公共变量

代码地址: https://code.csdn.net/snippets/1697496.git

int glob_int = 1; /* on .data section */ int* ptr= new int[3];

[wang@localhost fork]$ ./a.out ptr index=0 value= 1 ptr index=1 value= 2 ptr index=2 value= 0 child pid = 25994, glob_int = 2 ptr=0x1c26010, ptr index=0 value= 3 ptr index=1 value= 4 ptr index=2 value= 0 parent pid = 25993, glob_int = 1 ptr=0x1c26010

Q1 为什么父子进程打印的ptr地址是一样的

A1: 现象如下父进程malloc的指针指向0x12345678, fork 后,子进程中的指针也是指向0x12345678,但是这两个地址都是虚拟内存地址 (virtual memory),经过内存地址转换后所对应的 物理地址是不一样的。

所以两个进程中的这两个地址相互之间没有任何关系

(注1:在理解时,你可以认为fork后,这两个相同的虚拟地址指向的是不同的物理地址,这样方便理解父子进程之间的独立性) (注2:但实际上,linux为了提高 fork 的效率,采用了 copy-on-write 技术,fork后,这两个虚拟地址实际上指向相同的物理地址(内存页),只有任何一个进程试图修改这个虚拟地址里的内容前,两个虚拟地址才会指向不同的物理地址(新的物理地址的内容从原物理地址中复制得到))

虚拟地址里映射到真实的物理地址

验证2 共享数据块

fork 之后 父子进程之间什么样的数据是相同的?

  • fork之后父子进程共享文件表的同一项
  • A B进程操作外界资源 虽然是2个入口但是同一份数据 一方修改会影响另外一方 例如 为了提高性能、降低数据库连接消耗,openboss采用DBPool来管理数据库连接且DBPool为全局变量,所以当子进程退出时会调用DBPool的析构函数,DBPool的析构函数会执行断开数据库连接的操作

验证3 共享内存是进程本身的资源吗?

不是 共享内存有持续性: 随内核, 即进程重启共享内存中数据不会丢失 本身不具备协作能力 需要互斥锁 信号量等完成

http://blog.csdn.net/xy010902100449/article/details/44851453

http://blog.csdn.net/cywosp/article/details/27316803

http://blog.csdn.net/ordeder/article/details/21716639 http://blog.csdn.net/sunmenggmail/article/details/7565337

http://www.cnblogs.com/zhaoyl/p/3695517.html http://blog.csdn.net/liuhongxiangm/article/details/8308291

本文分享自微信公众号 - 架构说(JiaGouS)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shell中用到的管道有什么作用?(进程间传递数据)

    本周问题 来源 公司讨论qq群 执行命令 ps -ef | grep xxx | awk ‘{print $2}’ | xargs -i k...

    程序员小王
  • 代理单点故障如何解决(面试必备)

    如今 Twemproxy 凭借其高性能的优势, 在很多互联网公司得到了广泛的应用,已经占据了不可动摇的地位,

    程序员小王
  • 151. 翻转字符串里的单词

    程序员小王
  • Python开发实战教程(8)-向网页提交获取数据

    Python应用现在如火如荼,应用范围很广。因其效率高开发迅速的优势,快速进入编程语言排行榜前几名。本系列文章致力于可以全面系统的介绍Python语言开发知识和...

    做全栈攻城狮
  • 『高级篇』docker之微服务间如何通讯(六)

    在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE ...

    IT故事会
  • xss or 2实用的XSS黑客工具

    XSS OR 2 是一款免费的JavaScript在线入侵工具,使用JavaScript进行入侵。

    7089bAt@PowerLi
  • 指定节点滚动到屏幕中间的js

    父节点的class是slimScrollDiv 子节点的class是fa-warning 执行这个js

    Theone67
  • 字符串面试题(三)— 把一个字符串的大写字母放到字符串的后面

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • 自己实现事件总线-EventBus事件总线的使用

    在C#中,我们可以在一个类中定义自己的事件,而其他的类可以订阅该事件,当某些事情发生时,可以通知到该类。这对于桌面应用或者独立的windows服务来说是非常有用...

    架构师精进
  • 鼠标一键定位文献,谷歌学术就该这样用。

    小通之前分享过一键下载sci文章的方法,受到大家的热烈欢迎。此外,童鞋希望小通再推荐一种检索文献的高效方法。

    百味科研芝士

扫码关注云+社区

领取腾讯云代金券