当我在Perl中fork一个进程时,子进程可以看到其父进程的数据吗

问题描述 投票:0回答:2

假设我正在构建一个网络爬虫,并且我有一个包含所有访问过的 URL 的哈希值。

当我分叉子进程时,我希望能够从子进程访问访问过的 URL 的哈希值,但我不想复制哈希值,因为它很大并且会耗尽计算机的内存。

当我使用 Parallel::ForkManager 进行分叉并打印在父进程中声明的哈希地址时,当我从父进程和子进程中打印时,我会得到相同的地址,例如 HASH(0x7fc59d017f38)

但我想确保数据结构没有被复制到子进程

perl fork
2个回答
9
投票

不。每个进程都有自己的地址空间。子进程的地址空间一开始是其父进程地址空间的副本,但更改其中一个不会对另一个产生影响。您需要使用各种可能的通信渠道(管道、memcached、数据库、文件等)之一来显式交换您想要“共享”的数据。


0
投票

您可以从子进程访问父进程的哈希,但无法更新父进程的哈希,就像分叉完成后子进程无法看到父进程的任何更新一样。

这是因为两个进程使用相同的虚拟地址空间,但具有单独的物理地址空间映射,该映射最初作为“写时复制”共享(至少在几乎所有当前操作系统上)。 这意味着这些共享数据仅在 RAM 中(如果有的话)一次,但是一旦子级的任何父级修改了数据,就会创建修改后页面的副本。

© www.soinside.com 2019 - 2024. All rights reserved.