2012-03-08 160 views
3

我没有理解一些关于与叉生成过程()。 如果我试着像这样的代码:两个进程共享相同的堆

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

这两个过程都打印相同的地址。 那么他们是否指向堆中相同的内存区域? 这不危险吗?可能有冲突。 我的书说,在栈上的值复制,但它并没有谈论堆。所以那些存储器地址指向不同的存储位置

+0

https://en.wikipedia.org/wiki/Virtual_memory – 2012-03-08 14:19:06

回答

5

不同的进程包含在不同的虚拟地址空间。

正如Karoly Horvath所说,由于copy-on-write的优化,它会更复杂一点,它基本上允许拥有一个副本直到需要区分为止。这是通过页面错误实现的,最后两个单独的虚拟地址空间中的相同地址不涉及相同的存储位置。

+4

没有,他们指向同一个硬件地址,直到你把它写。当您执行fork()时,操作系统会将内存中的所有页面标记为在写入时创建页面错误。该写入被捕获,并且只有实际的复制发生。只要你只是从这个工作得很好,节省了宝贵的内存和CPU时间内存读取;) – 2012-03-08 13:39:43

+2

你应该是一个答案 – Useless 2012-03-08 13:53:08

0

环境,资源限制的umask,控制终端,当前工作目录,根目录下,信号口罩等处理资源从在叉形子进程父复制。

相关问题