【问题标题】:Two processes sharing the same heap两个进程共享同一个堆
【发布时间】:2012-03-08 13:30:34
【问题描述】:

我对使用 fork() 生成的进程一无所知。 如果我尝试这样的代码:

int main(int argc, char** argv)
{
    void* mem=malloc(100);
    pid_t pid=fork();
    printf("%p\n",mem);
}

两个进程都打印相同的地址。 那么它们是否指向堆中的同一内存区域? 那不是很危险吗?可能会发生冲突。 我的书说栈上的值是复制的,但是没有讲堆。

【问题讨论】:

标签: c fork heap-memory


【解决方案1】:

不同的进程包含在不同的虚拟地址空间中,因此这些内存地址指向不同的内存位置。

正如 Karoly Horvath 所建议的,由于称为 copy-on-write 的优化,它有点复杂,它基本上允许在需要区分之前拥有一个副本。这是通过页面错误实现的,最终两个单独的虚拟地址空间中的相同地址不会引用相同的内存位置。

【讨论】:

  • 不,它们指向同一个硬件地址,直到你写进去。当您执行 fork() 时,操作系统会标记内存中的所有页面以在写入时创建页面错误。此写入被捕获,然后才发生实际复制。只要您只从内存中读取,它就可以正常工作并节省宝贵的内存和 CPU 时间;)
  • 你应该这样回答
【解决方案2】:

环境、资源限制、umask、控制终端、当前工作目录、根目录、信号掩码等进程资源在fork的子进程中从父进程复制。

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多