我是 C 语言的相对初学者,正在尝试多重处理。如果这个问题非常基本或缺少必要的细节,我深表歉意,但我无法通过谷歌搜索找到任何直接的解决方案。
我有一个随机 int 值的 NxM 数组,以及一个长度为 N 的空一维数组来存储结果。
我想创建 K 个进程,将 N 行整数值均分,然后让每个进程对分配的行中的奇数整数进行求和,并将结果值写入结果数组中相应的位置。 (或任何其他返回整数输出的任意函数)。
数组可以是任意长度,并且可以变得非常大,所以我想在这里避免任何不必要的内存重复。
我知道 fork() 用于创建多个进程,但它似乎也复制了父进程的内存空间 - 有没有办法让每个子进程访问父进程的内存地址而不需要额外的空间?
谢谢!
您可能想要的是线程。
线程允许多处理而无需复制地址空间。
在线阅读
pthread
,了解在 c 中启动线程的最流行方法。
正如您所指出的,分叉进程会“复制”内存空间,但内存实际上并未复制,而是使用了一种称为写入时复制(COW)的技术。使用此技术,当发生分叉时,不会为子进程复制父进程的页面。相反,页面在子进程和父进程之间共享。每当进程(父进程或子进程)修改页面时,都会为执行修改的进程(父进程或子进程)单独创建该特定页面的单独副本。然后,此过程将在所有将来的参考中使用新复制的页面而不是共享的页面。
当您想要在两个进程之间共享内存时,您需要考虑使用进程间通信(IPC),这可以通过多种方式完成,例如通过管道/套接字,或者映射与分叉共享的共享内存块过程。子进程继承父进程的打开文件描述符,可用于设置此通道。
或者,如果您使用线程而不是分叉,则线程将使用相同的内存空间运行,而不会进行写时复制。
请注意,在所有情况下,您都必须小心避免共享资源的竞争条件,否则两个进程可能会尝试同时更改共享内存,从而互相破坏。
在大多数情况下,您需要线程而不是分叉。