首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候堆内存是为进程分开的?在执行系统调用中会发生什么?

什么时候堆内存是为进程分开的?在执行系统调用中会发生什么?
EN

Stack Overflow用户
提问于 2010-12-06 19:00:09
回答 2查看 1.2K关注 0票数 0

请容忍我,因为我不擅长安排问题。据我所知,这不是重复的问题。这肯定不是家务活。

当我们调用叉时,将创建一个线程,该线程与父进程共享堆内存。如果我用不同的进程映像(使用exec)覆盖这个线程的地址空间,会发生什么?

1)每个段将被新进程的相应段覆盖,还是说,完整的虚拟地址空间将被新进程的全地址空间覆盖?

2)操作系统将为这个新进程分配额外的堆内存,?&堆(在此之前共享)将不再被新进程访问?

3)所有这些混乱是因为我不知道可执行文件(准备加载)是否有堆段。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-06 19:30:28

叉创建在写时标记为复制的内存,以便进程不能通过此路径相互影响。

Exec释放对共享内存的访问,将其留给另一个进程处理。然后它为新的进程映像分配全新的内存。

实际上,维护打开的文件描述符等比这更复杂,但这是一个有用的近似。

编辑:我想你在第三点想知道的是:新进程是用一个新的空堆区域初始化的。但是,在调用main()之前,运行库可能会执行一些分配。

票数 1
EN

Stack Overflow用户

发布于 2010-12-06 19:16:34

Fork创建在写时复制的内存--当运行exec时,页面被覆盖,但是由于它们在写时被标记为复制,所以新的页被分配给子进程。旧页不再可用了。

更多信息来自维基百科:http://en.wikipedia.org/wiki/Fork_(operating_system)#Fork_and_page_sharing

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4369925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档