假设我正在构建一个网络爬虫,我有一个包含所有访问过的URL的哈希。当我分叉子进程时,我希望能够从子进程访问访问过的URL的哈希值,但我不想复制哈希值,因为它很大,会耗尽计算机的内存。当我使用Parallel::ForkManager进行fork并打印在父进程中声明的散列地址时,我从父进程和子进程打印时得到相同的地址,例如HASH(0x7fc59d017f38)但是我想确保数据结构没有被复制到子进程
ru9i0ody1#
不可以。每个进程都有自己的地址空间。子进程的地址空间是父进程地址空间的一个副本,但是更改其中一个地址空间对另一个地址空间没有影响。您需要使用多种可能的通信通道(管道、memcached、数据库、文件等)中的一种来显式地交换您想要“共享”的数据。
ilmyapht2#
您可以从子进程访问父进程的散列,但不能更新父进程的散列,就像子进程在fork完成后无法看到父进程的任何更新一样。这是因为两个进程使用相同的虚拟地址空间,但有一个单独的物理地址空间Map,最初作为“写时复制”共享(至少在几乎所有当前的操作系统上)。这意味着那些共享的数据只在RAM中(如果有的话)一次,但是一旦任何子进程的父进程修改了数据,修改后的页面就会被复制。
2条答案
按热度按时间ru9i0ody1#
不可以。每个进程都有自己的地址空间。子进程的地址空间是父进程地址空间的一个副本,但是更改其中一个地址空间对另一个地址空间没有影响。您需要使用多种可能的通信通道(管道、memcached、数据库、文件等)中的一种来显式地交换您想要“共享”的数据。
ilmyapht2#
您可以从子进程访问父进程的散列,但不能更新父进程的散列,就像子进程在fork完成后无法看到父进程的任何更新一样。
这是因为两个进程使用相同的虚拟地址空间,但有一个单独的物理地址空间Map,最初作为“写时复制”共享(至少在几乎所有当前的操作系统上)。这意味着那些共享的数据只在RAM中(如果有的话)一次,但是一旦任何子进程的父进程修改了数据,修改后的页面就会被复制。