两个进程共享同一个堆

Ram*_*uri 3 c heap fork

我还没有理解fork()生成的进程.如果我尝试这样的代码:

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

两个进程都打印相同的地址.那么它们是否指向堆中的相同内存区域?这不危险吗?可能存在冲突.我的书说复制了堆栈上的值,但它没有谈论堆.

per*_*eal 5

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

正如Karoly Horvath所说,由于称为写时复制的优化,它有点复杂,它基本上允许只有一个副本,直到需要区分.这是通过页面错误实现的,最后两个单独的虚拟地址空间中的相同地址不是指相同的内存位置.

  • 不,他们指向相同的硬件地址,直到你写入它.执行fork()时,操作系统会在内存中标记所有页面,以便在写入时创建页面错误.捕获此写入,然后才进行实际复制.只要你只是从内存中读取它就可以正常工作并节省宝贵的内存和CPU时间;) (4认同)
  • 你应该做出答案 (2认同)