【问题标题】:When is heap memory made separate for a process? What happens in the exec system call?什么时候为进程分开堆内存? exec 系统调用会发生什么?
【发布时间】:2011-05-21 04:10:25
【问题描述】:

请多多包涵,因为我不擅长提出问题。据我所知,这不是重复的问题。这肯定不是家庭作业。

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

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

2) 操作系统会为这个新进程分配额外的堆内存 ? & heap (shared before) 将不再被新进程访问?

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

【问题讨论】:

    标签: linux multithreading fork exec heap-memory


    【解决方案1】:

    fork 创建的内存被标记为写时复制,因此进程不会通过此路径相互影响。

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

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

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

    【讨论】:

    • 即在 fork 中复制的堆内存被释放并分配了新的内存...thnx 这个答案
    【解决方案2】:

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

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

    【讨论】:

    • 如果新线程(而不是进程)写入共享内存(堆,在 fork 之前分配),即使存在写入时复制机制,父级也可以看到它是真的吗?跨度>
    • @Amar:是的,线程在同一个内存空间中,所以它们会看到进程中任何其他线程看到的相同页面。
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2012-09-24
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多