首页 文章

指向不同值的相同地址 - fork系统调用

提问于
浏览
0

调用fork时,堆栈和堆都从父进程复制到子进程 . 在使用fork系统调用之前,我在malloc()中有一些内存;让我们说它的地址是A.在使用fork系统调用之后,我在父进程和子进程中打印了这个内存的地址 . 我看到两者都打印相同的地址:A . 子进程和父进程能够独立地向该地址写入任何值,并且一个进程的修改不会反映在另一个进程中 . 据我所知,地址在机器中是全球唯一的 .

我的问题是:为什么同一地址位置A同时存储不同的值,即使堆被复制了?

1 回答

  • 2

    "real"内存地址与您通常使用的内存地址(即"virtual"内存地址)之间存在差异 . 虚拟内存基本上只是操作系统的抽象,以便管理不同的页面,这允许操作系统将页面从RAM切换到HDD(page file),反之亦然 .

    这允许OS即使在达到RAM容量时也继续运行,并将相关页面文件放入RAM内的随机位置而不改变程序的逻辑(否则,指向0x1234的指针会在页面切换后突然指向0x4321)已经发生了) .

    如果你分叉你的进程会发生什么,基本上只是页面文件的副本,我认为 - 允许更智能的算法发生,例如只有当一个进程实际修改页面文件时才进行复制 .

    要提到的一个重要方面是分叉不应该更改任何内存地址,因为(例如在C中)应用程序中可能存在相当多的指针逻辑,依赖于您分配的内存的一致性 . 如果地址在分叉后突然改变,那么它将破坏该指针逻辑的大部分(如果不是全部的话) .

    你可以在这里阅读更多内容:http://en.wikipedia.org/wiki/Virtual_memory或者,如果你真的感兴趣,我建议阅读William Stallings的"Operating Systems - Internals and Design Principles",它应该涵盖大多数事情,包括为什么以及如何使用虚拟内存 . 在this StackOverflow thread中也有一个很好的答案 . 最后,您可能还想阅读thisthisthis问题的答案 .

相关问题