子进程复制了父进程的什么

关于子进程中的exit-----子进程中使用exit对于子进程复制父进程数据段、堆栈的影响 子进程中使用exit对于子进程复制父进程数据段、堆栈的影响 阅读详情

每次看到多进程时,子进程复制了父进程的所有数据(代码段、数据段、BSS、堆、栈),我们想当然的认为:子进程开辟了一块新的空间,把父进程的所有数据都复制过来。

而且每次我们改变名字相同的变量的值,输出的变量的结果都是不一样的。这也就更加坚定了我们的信心。但是,事实真的是这样吗?

运行下面这段代码,你会发现父子进程相同的变量输出的值不一样,但是地址却是一样的,看下面代码:

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

main(){
    char str[4]="asd";
    pid_t pid=fork();
    if(pid==0){
        str[0]='b';
        printf("子进程中str=%s\n",str);
        printf("子进程中str指向的首地址:%x\n",(unsigned int)str);
    }
    else{
        sleep(1);
        printf("父进程中str=%s\n",str);
        printf("父进程中str指向的首地址:%x\n",(unsigned int)str);
    }
}

输出:

子进程中str=bsd
子进程中str指向的首地址:bfc224dc
父进程中str=asd
父进程中str指向的首地址:bfc224dc

额,看起来貌似很令人费解,为什么同一段地址却存储不同的值?

事实是这样的:

      计算机内部有物理地址和逻辑地址之分。

      物理地址:由计算机内存管理单元分配管理,只有内核才知道

      逻辑地址:又名虚拟地址,是由CPU产生的。而我们通常使用程序打印出来的地址都属于虚拟地址,比如

   printf("address: %x\n",&temp);

      从逻辑地址到物理地址存在一个映射,被称为地址重定向.

       每一个进程产生都有自己的虚拟地址空间,映射到不同的物理空间。多进程时,子进程复制了父进程的虚拟地址,虽然虚拟地址相同,但是映射的物理空间却是不一样的。比如,我现在同时运行IE和QQ,他们都有可能访问自己的0x804a0d4这个虚拟地址,但是映射之后的物理内存就不会是同一个地址。所以,相同的指针不代表物理内存中的同一块区域。在用户看来,同一变量,拥有同样的地址,却存储不同的值,很怪异,但是却是在正常不过的事儿了!

当然,父子进程间的复制并不是我上述所说的那么简单(开辟一个空间,把全部数据复制过去),因为这样的话,如果一个大程序在运行中,它的数据段和堆栈都很大,一次fork就要复制一次,那么fork的系统开销不是很大吗?这肯定不合理,多进程的目的就是为了高效的处理事件,减轻系统开销。

查阅资料之后,发现存在一个很著名的概念"Copy On Write(写时复制)",父子进程间的复制就是依赖于这个概念,可以这样简单的理解:

       一般CPU都是以“页”为单位分配空间的,象Intel的CPU,其一页在通常情况下是4K字节大小,而无论是数据段还是堆栈段都是由许多“页”构成的,fork函数复制这两个段,只是“逻辑”上的,并非“物理”上的,也就是说,实际执行fork()时,物理空间上两个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区别,系统就将有区别的“页”从物理上也分开。系统在空间上的开销就可以达到最小。




Halcon dyn_threshold详解 dyn_threshold 原型 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 功能 利用局部阈值分割图像 参数列表 OrigImage (input_object):原始图像 ThresholdImage (input_object):处理后图像(一般采用滤波处理) RegionDynThresh (output_object):分割后区域 Offset (input_control):灰 阅读详情

相关推荐

PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理

在“PDF Document”栏中,依次选中除REF-TOP和REF-BOT之外的文件,单击图标,将其余PDF Document文件进行删除,如图所示。然后单击【生成PDF】按钮,即可创建一份PDF格式的位号图。

tianpu2320959696的博客 1025

对于多进程,子进程继承了父进程的内容

子进程继承父进程 用户号UIDs和用户组号GIDs环境Environment堆栈共享内存打开文件的描述符执行时关闭(Close-on-exec)标志信号(Signal)控制设定进程组号当前工作目录根目录文件方式创建屏蔽字资源限制控制终端 子进程独有 进程号PID不同的父进程号自己的文件描述符和目录流的拷贝子进程不继承父进程的进程正文(text),数据和其他锁定内存(memor

gaosaixing的博客 8534

ANSYS Maxwell:从RMxprt到3D轴向磁通电机的无缝建模指南

本文详细介绍了如何利用ANSYS RMxprt作为高效起点,快速构建3D轴向磁通电机的有限元分析模型。通过RMxprt内置模板输入关键参数并完成磁路法计算后,可一键生成包含几何、材料、绕组及边界条件的即用型Maxwell 3D模型,极大简化了复杂三维结构的建模流程,使工程师能专注于性能优化与仿真分析。

weixin_29281941的博客 555

linux下的fork()函数

linux下fork函数的理解 正文说明: 第一次在优快云上写博客,请各位方家多多指正,其中的精髓是参考一位很优秀博主的博客, 原文链接:link 本人在读了之后有醍醐灌顶之感,于是决定自己再回顾重写一遍。 正文如下: C语言代码实例: #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt;

Zayn的博客 596

LC整流滤波电路DIY:电感电容配合,手把手搭建低纹波直流电源

在直流电源设计中,整流滤波是连接交流输入与稳定输出的关键环节。常见的电容滤波虽然简单,但在大负载下纹波抑制能力有限,电感抵抗电流突变、电容抵抗电压突变,二者组合构成的LC滤波能有效降低输出电压纹波,同时减小开机浪涌电流。在工频线性电源、功放电源等对噪声敏感的场景中,LC滤波常作为稳压前的平滑缓冲。本文以一套完整DIY项目为线索,介绍整流桥后串联功率电感、并联滤波电容的电路构成,结合实际计算与波形测试,讨论电感量估算、电容选取、谐振风险、饱和电流等工程问题,并给出上电测试和故障排查方法。通过搭建与调试,可直观

weixin_29168813的博客 377

暑期实习前端面试笔试总结汇总

腾讯2020暑期实习——前端视频面试(1)回顾 腾讯2020暑期实习——前端视频面试(2)回顾 腾讯2020暑期实习——前端视频面试(3)回顾 腾讯2020暑期实习——前端视频面试(4)回顾 蘑菇街2020暑期实习——前端视频面试回顾 二、笔试 奇安信前端实习笔试总结 vivo笔试(2020年3月8日) ...

明媚 3065

linux的fork()函数详解 子进程复制父进程什么

#include   #include   #include   #include      void main()   {       char str[6]="hello";          pid_t pid=fork();          if(pid==0)       {           str[0]='b';           printf("子

u012590688的专栏 2343

64、5G 侧链通信技术详解

本文详细解析了5G侧链通信的关键技术,包括资源感知与选择、UE间协调、混合ARQ、功率控制、信道探测与CSI报告以及侧链同步。资源感知与选择通过周期性或随机方式实现资源分配,UE间协调通过主动或被动方式避免资源冲突。混合ARQ机制确保数据传输可靠性,功率控制和信道探测优化传输质量并减少干扰。侧链同步则通过多种方式确保设备间时间一致性。这些技术相互配合,构建了高效稳定的5G侧链通信体系,适用于智能交通、物联网、应急通信等多个领域,为未来无线通信发展提供强大支撑。

oil88的博客 101

父子进程共享文件

父子进程共享文件 1、父进程和子进程可以共享打开的文件描述符。 2、父子进程共享文件描述符的条件:在fork之前打开文件。 3、对于两个完全不相关的进程,文件描述符不能共享。 4、父子进程文件描述符是共享的,但是关闭的时候可以分别关闭,也可以同时在公有代码中关闭。 Fork函数创建子进程后,子进程将复制父进程的数据段、BSS段、代码段、堆空间、栈空间和文件描述符,而对文件描述符关联的内核文件表项(...

weixin_43937576的博客 5497

2026.5.3:Ubuntu26.04下uv所需的环境变量pyproject.toml

本文档提供了Python开发环境的配置指南。主要包括: 设置环境变量(HF_ENDPOINT、UV_PYTHON_INSTALL_MIRROR等) 创建pyproject.toml配置文件,定义项目元数据(名称、版本等) 指定依赖项(torch系列库)及其安装源(PyTorch官方CUDA 12.8镜像) 配置Python版本要求(>=3.13,<3.14) 设置平台限制(Linux/Windows) 该配置适用于需要PyTorch CUDA 12.8支持的项目开发环境搭建。

拥抱具身智能,昇腾Ascend C 589

【雕爷学编程】Arduino智慧交通之RF24通信实现车队之间的实时通信和协调

通过这些示例,车队领导可以发送指令给车队成员,车队成员可以接收指令并执行相应的操作,同时车队成员也可以发送自己的位置信息给车队领导或其他成员,以实现车队之间的实时通信和协调。例如,在高速公路上,车队中的车辆可以根据前方车辆的速度和位置信息,自动调整自身的速度和距离,以保持车队的整体稳定和安全。Arduino智慧交通系统利用RF24通信模块实现车队之间的实时通信和协调,通过无线通信技术,车辆之间可以实时传输数据和指令,以实现车队的协同行驶和交通优化。通过数据处理和分析,可以生成实时的交通信息和统计数据。

雕爷学编程 1075

fork之后子进程到底复制了父进程什么

作者:狂奔的乌龟 来源:优快云 原文:https://blog.youkuaiyun.com/xy010902100449/article/details/44851453 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> void main...

一直走,不要回头 2993

“华为杯”研究生数学建模竞赛2017年-【华为杯】B题:面向下一代光通信的 VCSEL 激光器仿真模型

得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰值向。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状。方案,包括可能的数学公式,不同温度和偏置电流下的带宽响应曲线,并与问题。线,得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状逐渐变得。得的激光器特性曲线和模型中仿真得到的特性曲线,之后,可以将两组曲线的差。说明的是,由于数值优化算法的成功与否很大程度上依赖于初始参数的猜测,参。

getusushu的博客 98

fork子进程复制了父进程什么

转自:http://www.cnblogs.com/zhangchaoyang/articles/2317420.html 子进程复制了父进程的什么 如果你对代码段、数据段、栈、堆存放哪些数据还不是很清楚,请先看我写和Linux 内存管理。 有时会出现父子进程变量的地址一样,但值不一样。看下面代码: #include #includestring.h> #include #

enockipp的小'码'头 1575

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux下利用文件IO函数完成多进程复制图片,父进程复制前一半,子进程复制后一半

由于会出现光标错乱的问题,然后想到了通过 lseek 函数 调整光标到最后,发现还是不可以,因为我用的是两个文件描述符表,而且指向的系统文件表也不是一个位置。目前的想法是,如同 CPU 在终端、异常、系统调用时保留断点一样,父子进程每次复制完分别更新自己的断点,下一次更换进程后再回来时也能读取到这个断点。最开始我想到的是一个字节一个字节复制,等复制完前一半的内容后再创建子进程,然后子进程负责后面的复制,后来又想到了,既然是多进程,那么最好上来就创建子进程来练习,不然多进程就没有了意义。

This code no bug! 386

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【进程管理】fork之后子进程到底复制了父进程什么?

假定父进程malloc的指针指向0x12345678, fork 后,子进程中的指针也是指向0x12345678,但是这两个地址都是虚拟内存地址 (virtual memory),经过内存地址转换后所对应的 物理地址是不一样的。所以两个进城中的这两个地址相互之间没有任何关系。 (注1:在理解时,你可以认为fork后,这两个相同的虚拟地址指向的是不同的物理地址,这样方便理解父子进程之间的独立性) (注2:但实际上,linux为了提高 fork 的效率,采用了 copy-on-write 技术,fork后,这

ZP1015 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

子进程可以复制父进程的缓冲区吗?

在阅读《UNIX 高级环境编程》进程控制那块,有个例子是差不多这样的: 在子进程中改变变量,观察父进程之后变量的变化 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include...

adlatereturn的博客 547

fork_子进程会复制父进程的缓存空间

前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的: 题目:请问下面的程序一共输出多少个“-”? #include #include #include int main(void) { int i; for(i=0; i<2; i++){ fo

水滴石穿 4170
上一篇: 为何 Emacs 和 Vim 被称为两大神器
下一篇: “Copy-on-write”---->写时复制
mwumli
博客等级 码龄14年 2粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值