首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

子地址空间是否会影响父地址空间

子地址空间会影响父地址空间。在计算机系统中,地址空间是指一个进程可以使用的内存范围。父地址空间是指进程的主地址空间,而子地址空间是指由父进程派生出的子进程的地址空间。

当子进程被创建时,通常会将父进程的地址空间复制给子进程,包括代码段、数据段、堆栈等。子进程可以在自己的地址空间中独立运行,并且对地址空间进行修改和管理。这意味着子进程的行为会影响父进程的地址空间。

具体来说,子地址空间对父地址空间的影响主要有以下几个方面:

  1. 内存占用:子进程在创建时会复制父进程的地址空间,因此会占用额外的内存资源。如果子进程对地址空间进行了修改或分配了新的内存,则父进程的地址空间也会相应地增加。
  2. 内存共享:子进程可以共享父进程的部分地址空间,这样可以避免复制大量的内存数据。当子进程修改共享的内存区域时,父进程也会受到影响。
  3. 进程间通信:子进程可以通过进程间通信机制与父进程进行交互,例如共享内存、管道、消息队列等。这种通信方式需要在地址空间中分配相应的资源,因此会对父地址空间产生影响。

总之,子地址空间会对父地址空间产生影响,包括内存占用、内存共享和进程间通信等方面。在进行云计算开发时,开发工程师需要了解和管理地址空间的使用情况,以确保系统的稳定性和性能。对于云计算场景,腾讯云提供了一系列相关产品,如云服务器、云数据库、云存储等,可以满足不同需求的开发和部署。具体产品介绍和链接地址请参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

程序地址空间

,难道是因为子进程是按照父进程位模板,父子并没有对变量进行任何修改?...页表用来存放逻辑地址于物理地址的对应关系,是否映射,是否缓存。...页表的工作原理 当CPU想访问父进程的val时,会先根据虚拟地址找到虚拟页,根据页表,找出页表val对应的位置,查看该页表是否有效,有效则为1,DRMA换命中,根据物理页中的内容返回。...进程地址空间不隔离,由于空间时直接访问物理内存的,所以每一个进程都可以修改其他进程的内存数据,设置修改内核地址空间的数据,那么可能会导致一些恶意程序可以随意修改别的进程,就会造成一些破坏。...程序运行地址的不确定,因为内存地址是随机分配的,所以程序运行的地址也是不正确的。 为此才会引入虚拟地址。用户进程间的地址互补可见,互不影响。

9410

【linux】地址空间

分页和虚拟地址空间 地址空间的本质就是内核中的一个结构体对象,子进程会把父进程的很多内核数据结构全拷贝一份(浅拷贝),当子进程尝试对变量进行修改时,我在物理内存重新开辟一块空间,新的物理地址放到页表当中...当一个进程调用 fork() 创建子进程时,操作系统原本需要复制整个进程的地址空间到子进程中。然而,通过使用写时拷贝技术,子进程最初会共享父进程的地址空间中的所有页,而不是物理上复制它们。...共享内存页:在 fork() 后,父进程和子进程会共享同一物理内存页,每个页表项被标记为只读。...修改触发拷贝:如果父进程或子进程尝试写入某个共享页,CPU的内存管理单元(MMU)会触发一个保护页异常(page fault),操作系统响应这个异常,进行真正的物理拷贝。...普通进程优先级(100-139)是根据进程的行为(如是否等待IO操作、交互操作频繁等)动态调整的。系统会奖励交互式任务较高的优先级,而使得计算密集型任务可能降低优先级。

9810
  • 进程地址空间

    我们知道,子进程在创建的时候会和父进程共用一片代码和数据,当其中一个要修改其中的数据时会发生写时拷贝。...所以说,子进程和父进程的val值虚拟地址虽然相同,但是,由于页表上的对应关系不同,让他们指向了两个不同的物理地址,这样他们的值就产生了不同。...区域划分目的:也就是为了方便管理,用特定的数字位进行划分,可以判断是否越位,是否需要扩容或者缩容。 区域划分的本质:也是为了,每一个地址都能被使用。...页表上其实还有存储着权限位这个信息,当子进程创建的时候,继承父进程的数据和可执行程序时,父子进程在页表上记录着的,对于内存上的代码和数据都只有可读权限,当其中一方想要去修改数据时,发生写时拷贝的时候,就必然改动权限...保护内存安全,对异常地址的访问时,它们就会拦住非法的请求操作。eg:访问野指针,程序崩溃,但并不影响OS正常的运行,也不影响其他进程正常运行,因为拦住你的是你自己的地址空间和页表,只会影响你自己。

    10410

    【Linux】地址空间&&虚拟地址

    子进程会把父进程的很多数据结构全拷贝一份,基本上子进程的PCB、地址空间和页表基本上和父进程的一致。...子进程的地址空间也会有一个虚拟地址,子进程对应的页表也来自父进程,所以页表保存的地址,从而子进程也会指向那个g_val。...而进程本身在运行的时候具有独立性,所以子进程对数据进行修改,就不能影响到父进程,所以当子进程尝试对数据进行修改时,操作系统发现父进程也有,就在在子进程修改之前,在物理内存中出现开辟一个空间,开辟完成之后...修改的只是子进程的物理地址和页表,而地址空间里面的依然是虚拟地址。子进程和父进程的虚拟地址是一样的,只是映射到物理内存到不同区域,所以对应看到的地址是一样的,但内容却不一样。...当父进程一旦创建子进程,父进程为了支持写时拷贝,因为父进程走到已初始化全局区本来就是可以写的,但创建子进程之后,操作系统会直接修改页表中该位置的权限,都修改为r。

    18510

    进程地址空间

    文章目录 一.感性理解进程地址空间 二.理性认识进程地址空间 1.虚拟和物理地址空间 2.虚拟地址和物理地址联系 a.页表映射 b.写时拷贝 三.为什么要存在进程地址空间 在正式开始之前我们首先来看这样的一个现象...父子进程(父子进程谁先运行,这个不确定,由调度器决定)更改以前打印的都是同一个地址同一个值这很好理解,子进程在改变了全局变量的值以后,父子进程输出的值不一样了也勉强可以理解,因为进程之间具有独立性...那么老板必须要记得他给每个员工画的饼是怎么样的,如果今天和昨天画的饼不一致,这个老板可能会失去员工们的信任。所以老板在管理员工的同时,还要管理自己画的饼。...}; 二.理性认识进程地址空间 进程之间是共享CPU和主存资源的,但随着对CPU需求的增长,太多的进程需要太多的资源,有些进程就可能会卡死,此外如果某一个进程发生了越界,就会影响到别的进程的存储器。...页表会将虚拟地址中和数据的物理地址建立连接,当需要访问数据时,页表会根据虚拟地址对应的物理地址去物理内存中查找需要的数据。

    68230

    进程地址空间

    所谓的进程虚拟地址空间, 本质是一个内核数据结构(类似PCB)。 3. 理解区域划分 区域划分的本质就是使用一个结构体变量, 存储开始和结束即可。 4. 理解地址空间上的地址 a...., 那么子进程就和父进程是共享的, 如果是写入, 则写入时操作系统会另外在物理内存开辟一块地址, 所以物理地址是不一样的。...如果一个很大的进程要被加载进来, 从磁盘到内存中是分批加载的, 通过页表的标记为来标记某段代码是否在内存中存在, 另外还有标记为使用来记录执行权限的, 比如code区域为什么是只读取, 其实是页表的rwx...地址空间本质上是一个struct mm_struct 所有的内容都是OS系统进行自动完成的, 其实只要把进程管理好,地址空间就管理好了。...那为什么全局变量字符串常量具有全局性呢,因为在地址空间中,他们会随着进程一直存在,全局变量的虚拟地址,一直被大家看到,而栈区和堆区都是由操作系统进行动态管理的。

    9710

    进程地址空间

    程序地址空间   我们在学习C/C++的时候我相信大部分人都见过下面这张图:   有一些细微的差别,但是并不影响,按照正常人的逻辑思维方式低地址放在下面,高地址放在上面。...可以发现子进程将 g_val 的更改之后,为什么父进程的 g_val 却没有变?难道是写时拷贝?但是他们的地址一模一样,明明是同一个变量啊!!   ...而进程创建子进程的时候,子进程会继承父进程这个表的,当子进程对 g_val 的值进行修改,并不能从父进程的表中对应物理地址进行修改,因为进程是具有独立性的!   ...所以,子进程需要再内存中单独开辟另一块空间用来存储修改过的 g_val ,但是这是子进程和父进程虽然 g_val 虚拟地址相同,物理地址却不同了,所以就能看到 “同一个变量有两个值” 的现象。...系统给我们提供一张虚拟地址和物理地址的映射表——页表(Page tables) ✏️总结  我们了解了程序地址空间各个区域有什么,并且他们是什么顺序存放的,而在子进程对全局变量做修改与父进程得到两个不同的结果

    10110

    深入进程地址空间

    但是通过结果可以发现,父进程和子进程各自的全局变量地址都是0x601054。明明是同一个地址空间,为什么全局变量gval的值不同呢?...然后操作系统会对物理内存地址的数据进行访问管理。 子进程会继承父进程的虚拟地址空间和页表。 如何通过一个字节地址访问多个字节大小的数据? 通过地址和类型偏移量确定整个数据。...进程如何独立 子进程的虚拟地址空间和页表会继承父进程,那么进程之间是怎么独立的呢? 假设父进程存在一全局变量int g_val,在当前父进程虚拟地址在页表中已经与物理地址映射。...然后创建子进程,当子进程中尝试对g_val修改时操作系统会进行以下操作: 在物理地址空间中会重新开辟一块int大小的空间,在此空间内存储修改后的地址。...此时,因为继承的关系,父进程与子进程中的g_val使用的是同一个虚拟地址,但由于子进程对g_val进行修改,所以同一个变量的虚拟地址映射的是不同的物理地址。 这就是写时拷贝的机制!!

    5800

    Linux系统 —— 进程系列 - 程序地址空间:虚拟地址空间

    在我们的操作系统里面,一个进程会构建一个页表,我们页表左侧存储的是我们的虚拟地址,右侧存储的是物理地址 页表是用来做虚拟地址到物理地址映射的:所有的数据包括代码本身全部都有地址,所以每一个元素对应的地址都是由每一个虚拟地址加载到物理内存然后经过页面映射找到物理内存...我们都知道,进程有两个进程一个是父进程,另一个是子进程,而我们上面的就是父进程,我们下面这张图片就是子进程,子进程所有数据都是从父进程哪里拷贝下来的(包括:task_struct,页表,数据 ....,页表就会把父进程的页表拷贝到子进程的页表里面,这种概率就是发生了简单的浅拷贝,其实就相当于它们都指向了同一个物理内存,所以父进程和子进程的代码和数据都是共享的 这个时候我们就有一个问题:子进程要对变量进行修改怎么办...答案是:当子进程要对变量进行修改时,这个时候我们的OS就会介入,OS直接给我们开辟一段新的地址空间,然后把我们之前的内容拷贝进新开辟的空间里,那么这个时候我们就会得到一个新的物理地址,然后OS再重新填写页表...为什么要有虚拟地址空间 也可以说是:如果程序直接可以操作物理内存会造成什么问题?

    10610

    初识Linux · 地址空间

    前言: 本文介绍的是有关地址空间,咱们的介绍的大体思路是,先直接看现象,通过现象我们引入地址空间的概念,然后是简单的介绍地址空间,如何理解地址空间等,在往后的学习中,我们大概会介绍地址空间3 - 4次,...,在父进程里面创建一个子进程,子进程要完成的工作是打印g_val和它的地址,当count到5的时候就修改g_val,但是后续还是要一直打印,父进程要做的工作就是一直打印g_val和g_val的地址。...大体图就是这样,父进程和子进程得到的虚拟地址是一样的,但是呢,当子进程对父进程中的某个数据发生了修改,此时就会发生写时拷贝,即在物理内存层面拷贝一个该数据,子进程指向该数据即可。...既然子进程修改父进程中的数据,会导致发生写时拷贝,那么在物理内存层面,为什么不全部拷贝一份呢?...这是一种对物理内存的保护,再比如,一对父子,子如果直接拥有钱,自由支配,不免的会买不利于成长的玩具,但是父如果作为中间商,对钱进行管理,子想要买,必须通过父这一层,此时,子想买扑克牌,父制止,这个就是对非法请求的拦截

    7810

    Linux进程地址空间

    Linux进程地址空间是学习Linux的过程中,我们遇见的第一个难点,也是重中之重的重点。虽然它很难,但是,等我们真正懂得了这样设计的原理,我们不禁会感叹:这真的是太妙了。...虽然每一个进程只有1个虚拟空间,但是这个虚拟空间可以被别的进程来同享。如:子进程同享父进程的地址空间,而mm_user和mm_count就对其计数。...有一进程在调用fork函数创建子进程时,操作系统会将父进程的PCB,mm_struct结构体,包括页表复制一份给子进程,所以父子进程中相同的虚拟地址通过页表映射会找到同一块内存空间,读取到相同的数据。...如果其中一个进程想要对数据进行修改,我们知道进程之间必须确保独立性,一个进程修改的数据极有可能会影响到另一个进程。...其中,这种父子进程先共享一份内存数据,然后等到父或子进程要对共享数据进行修改时,操作系统为了保证进程之间的独立性,才为其分配各种的内存空间,这种方式叫做写时拷贝。

    12210

    linux进程地址空间

    ,bash本身在启动的时候会从操作系统的配置文件里面读取环境变量信息,子进程会继承父进程交给我们的环境变量; 3.程序地址空间 3.1地址空间简介 我们的程序存储区分为代码区,字符常量区,全局数据区,堆区...,而是我们的虚拟地址; 3.3页表概念的引入 页表是一张显示这个虚拟地址和真真实的物理地址的关系的映射表; 我们的这个父进程和子进程都有自己的进程地址空间,子进程的进程地址空间 是对于这个父进程的一个拷贝...,所有的信息都是一样的,相当于就是一份拷贝; 但是当我们对于这个父进程里面的变量进行修改的时候(子进程会和父进程共享代码和数据)因此这个父进程的变量在子进程里面也是存在的,但是因为这个进程具有独立性,因此这个会发生写实拷贝...,子进程和父进程的关系,调度是一套统一的流程; 当我们访问内存的时候,会增加一个转换的过程,在这个转换的过程中,虚拟地址空间会进行审查,例如我们对于这个只读区域进行修改,显然是不符合要求的,这个时候的地址空间就会进行这个请求的拦截...,我们的物理地址空间才会被开辟,经由我们的页表的权限审核,确定这个是否要在我们的物理地址上面开辟空间; 因此这个里面存在缺页中断,就是这个虚拟地址空间没有对应的物理地址空间,就是这个页表上面的虚拟地址数量大于这个物理地址数量

    4410

    【Linux】进程地址空间

    /mytest ,执行mtest可执行程序 子进程被全局数据的修改,被不影响父进程 ,说明进程具有独立性,而进程是由内核数据结构+代码和数据组成的,独立性体现在数据上,所以通过写时拷贝的做法 使一个进程的变量被修改...,CPU会自动根据页表将虚拟地址转化为物理地址 创建子进程,就要创建子进程的PCB,及地址空间和页表结构 子进程的相关内核数据结构的属性字段会继承父进程 大富翁 A有个儿子是E,A跟E说,我们家有10...个亿是你爷爷的,所以E要继承给他10亿的大饼 所以子进程在虚拟地址处也有对应的地址 正常来说,子进程要对value对修改,把value变成200,父进程通过映射关系找到value,读到200 但因为进程具有独立性...,子进程对数据的修改,不影响父进程 子进程要对value修改时,在内存中重新申请一块空间,拷贝value值给新空间,重新映射指向新开辟的空间,导致不影响父进程的value值 ,最终将新开辟的空间value...,在地址空间中申请空间,在页表处只填写虚拟地址,物理地址处不填写,就不需要在物理地址处申请空间,过一会,进程尝试对空间写入,在重新申请空间把映射关系创建好,整体机制被叫做 缺页中断 8.

    3K10

    Linux:进程地址空间

    1、在我们C语言内存管理机制里面线性地址是有区域划分的。        我们如何验证这个区域的划分是否正确呢?...——>所以当我们创建出一个子进程后,他会拷贝一份和父进程一样的地址空间,然后当子进程想要修改对应的数据时,此时就会发生写时拷贝(由操作系统自动完成),也就是重新开辟空间,在这个过程当中只有页表对应的物理地址发生了变化...但实际上是这些私生子要多少才会给多少(进程需要多少空间操作系统就给多少空间)  结论1:让进程以统一的视角看待内存      这样我进程就不需要关心说具体应该放在物理内存的什么位置,也不需要关心当前这个物理内存是否会影响别人的数据...所以为什么子进程可以继承父进程的环境变量,因为子进程启动时,父进程已经把对应的环境变量信息加载进去了, 他也是地址空间的一部分,所以他必然有页表去帮助我们建立虚拟地址和物理地址的映射,而当子进程创建的时候...,子进程也会将父进程虚拟地址空间当中的环境变量的相关参数也给我们建立了一份映射,所以即使你传参数,子进程也照样能够获得父进程的环境变量信息。

    13110

    【Linux】进程地址空间

    gal值进行修改然后再让父进程进行读取的时候,我们发现父进程读取的值依旧是原来的g_val值,而子进程读取的值已经是修改值,但地址还是相同的,地址相同怎么会读取到不同的值呢?...结合我们在前面讲到的,如果子进程修改了数据,我们会在另一块位置重新开辟一块空间用来存放子进程与父进程不同的这部分数据,这是为什么呢?这个实现的原理是什么呢?...,也就是虚拟地址是相同的,我们不是复制出了两个地址空间,这里需要注意 内核空间中有父子进程的task_struct,它们里面有指向各自页表的指针 其中上方是父进程的地址空间,下方是子进程的地址空间,子进程直接复制父进程的地址空间...,包括虚拟地址、页表等等变量都是相同的,类似于一个浅拷贝的过程,在子进程修改g_val变量时,子进程在物理内存上新开辟一块空间,用来存放与父进程数据不同的量,这个过程类似于memcpy的过程,创建并复制内容...地址范围内的 4GB 物理内存 我们的进程地址空间就在这样一个概念中展开,而地址空间的划分实际上是对该空间的一种组织,在正常运行的情况下互不影响 我们计算机中最小的存储单元就是字节byte,每个字节都会有一个地址

    7910

    进程地址空间管理

    访问非法地址: 程序试图访问一个不存在的虚拟地址(如超出地址空间范围)。 操作系统会判断访问是否合法,非法访问将触发异常。...检查页面是否合法: 操作系统检查虚拟地址是否属于当前进程的合法地址范围: 如果地址非法(如访问未分配的堆空间),操作系统会终止进程,抛出段错误(Segmentation Fault)。...当一个新进程被创建(例如通过 fork 或 exec 系统调用)时,操作系统会: 创建虚拟地址空间: 为进程分配独立的虚拟地址空间,确保不同进程之间的地址空间隔离。...为什么要有进程地址空间 将地址从无需变有序 数据从磁盘加载到物理内存是动态加载的,顺序会变得无规则,甚至乱序。...vm_area_struct 对于在程序中动态申请的空间来说,一般会申请在堆区中。但是在程序中可能会频繁的申请,难道对于虚拟地址空间中的堆区来说,不只有一个起始地址吗?可能是离散分布的吗?

    7110

    Linux系统-进程地址空间

    ,子进程以父进程为模板构建进程,代码父子共享,数据各有一份(谁进行写入谁发生拷贝) 而我们发现子进程数据发生修改时,子进程数据的地址和父进程的地址一样,没有发生改变 对于变量内容不一样,但地址值是一样的...PCB找到对应的进程地址空间,再由进程地址空间上的虚拟地址由页表找到物理空间上分配的数据 示图: 对于父子进程变量地址相同数据不同: 父进程创建子进程时,子进程以父进程为模板构建进程,代码数据父子共享...,当子进程进行修改数据时,由页表发现该数据是父子进程共享的,所以系统会找到另一个物理空间进行拷贝数据,拷贝数据后再修改数据,达到数据各有一份互不干扰的目的 注:这种在需要进行数据修改时再进行拷贝的技术称为写时拷贝...示图: 3、相关问题 为什么数据要进行写时拷贝 进程需要保证独立性,多进程运行,需要独享各种资源,多进程运行期间互不干扰,数据写实拷贝让子进程的修改不影响到父进程 为什么不在创建子进程的时候就进行数据的拷贝...子进程不一定会使用父进程的所有数据,并且在子进程不对数据进行写入的情况下,没有必要对数据进行拷贝,我们应该按需分配,在需要修改数据的时候再分配(延时分配),这样可以高效的使用内存空间 如果

    3.8K30

    Linux之进程地址空间

    i变量,父进程和子进程访问时获得的值却不是相同的,这是什么原因呢?...3.现象的具体解释 父进程和子进程都有自己独立的进程地址空间,也有独立的页表结构。子进程由父进程创建,因此子进程的进程地址空间是拷贝父进程的进程地址空间。...后来,子进程修改了i的值,操作系统通过页表映射发现i的值是两个进程共享的,操作系统为了保持进程的独立性,当子进程或者父进程任何一方尝试对共享的数据做写入,操作系统就会在物理内存上重新开辟一块新的内存空间拷贝原来的数据...方便进程之间的数据代码的解耦,保证了进程的独立性; 一个进程对数据的修改不会对另一个进程造成影响,保证了进程的独立性。...三、怎么办 操作系统要为每一个进程分配地址空间,那么操作系统是否要管理这些地址空间呢?当然是要管理的。 那么,操作系统怎么管理进程的地址空间?

    26320

    返回栈空间地址 问题

    当我们返回栈空间地址时会报错,为什么呢?那让我们先看一下什么是返回栈空间地址? 下面是错误示范: vs2022版演示  出现问题,不要慌,那我们就先调试一下。...3.进入GetMory函数,字符型的数组p 赋值为“hello”,return p;p是一个数组,return p;p是数组名,实际是返回的数组的首元素地址‘h’的地址。...当GetMory函数结束时,p就会自动销毁,也就是说p所开辟的空间就会还给操作系统,但p那块空间的地址还存在而且传给了str,当str顺着这个地址访问时,地址原来的空间已经被销毁了,不存在了,但我还要去访问那块空间...答案是肯定哒,yes  上面就是栈空间地址问题的讲解,总结一下简单可以理解为,函数调用如果返回值为一个局部地址,就会出错,除非返回变量,或加上static修饰。...另外加一个知识点,如果空间是在堆区上开辟的,堆区只有  free来释放空间,所以不存在返回占栈空间地址问题。

    13420
    领券