进程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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人随笔

Java 多线程 从无到有

个人总结:望对屏幕对面的您有所帮助 ? 一. 线程概述 进程: 有独立的内存控件和系统资源 应用程序的执行实例 启动当前电脑任务管理器:taskmgr 进程是...

3375
来自专栏前端黑板报

再谈异步

小亲冈 爱屋吉屋 前端开发工程师 按顺序完成异步操作 实际开发中,经常遇到一组异步操作,需要按照顺序完成。比如,展示页面中有上中下三个部分,每一部分通过一个接口...

2035
来自专栏蓝天

优雅的让一个类在线程安全和线程非安全间切换

一个良好的多线程库,不应当一刀切的全加锁。因为有些时候,虽然是多线程环境,但可能依照设计一个类只会被一个线程操作,这个时候加锁是多余的,纯浪费性能,但另一些场景...

632
来自专栏liulun

Nim语言的模块化编程

前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块...

3607
来自专栏与神兽党一起成长

封装一个FTP工具类

前人的代码中把FTP操作和业务逻辑实现耦合在一起,据说经过多次的修改,在性能表现方面已经非常靠谱。 在原来的代码中可以看到使用了commons-net进行FTP...

3284
来自专栏大闲人柴毛毛

程序员必知的并发编程注意事项

获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 单例对象会被多线程共享,因此要保证它是线程安全的,它其中的方法都要保证是线程安全的。 工具类、资源...

4175
来自专栏Java后端技术

深入聊聊Java多线程

  在没有学习Java多线程以前,总觉得多线程是个很神秘的东西,只有那些大神才能驾驭,新年假期没事就来学习和了解一下Java的多线程,本篇博客我们就来从头说一下...

1164
来自专栏xingoo, 一个梦想做发明家的程序员

跟着ZooKeeper学Java——CountDownLatch和Join的使用

在阅读ZooKeeper的源码时,看到这么一个片段,在单机模式启动的时候,会调用下面的方法,根据zoo.cfg的配置启动单机版本的服务器: public voi...

3494
来自专栏PhpZendo

MVC 框架中的路由器(Router)是如何跑起来的

MVC 路由器(Router)或分发器(Dispatcher)会检测 HTTP 请求的 URL,并尝试将单个 URL 组件与控制器和控制器中定义的方法匹配,同时...

1051
来自专栏博岩Java大讲堂

Java集合--阻塞队列(引言)

35712

扫码关注云+社区

领取腾讯云代金券