gpt4 book ai didi

C 并发进程和静态变量

转载 作者:行者123 更新时间:2023-11-30 15:12:10 25 4
gpt4 key购买 nike

我创建了一个 C 程序,它在一个进程中完成所有操作。例如,它按顺序读取一个文件,然后输出一些内容。我必须使用一个称为 vector 的巨大数组,因此我将其声明为静态(因为它给了我一个段错误)。静态双 vector [100000][10000]。

现在我需要使用多个并发进程创建与前一个程序相同的输出。

到目前为止我所拥有的:

pid_t pids[argc - 1];
int pid;
for (e=1; e < argc; e++)
{
pid = fork();
if (pid < 0)
{
//error
}
else if (pid > 0)
{
pids[e-1] = pid
}
else
{
printf("The child process of %d is started\n", pids[e-1]);
printf("The child process of %d is finished\n", pids[e-1]);
}
}

for (int i = 0 ; i < argc - 1 ; i++)
{
int status;
waitpid(pids[i], &status, 0);
printf("Process %d is finished\n", pids[i]);
}

现在我只是想看看子进程的输出是否交错,这意味着它们将同时运行。

到目前为止,当我运行上面的代码时,我收到“Killed”消息,但是一旦我注释掉静态 vector 数组,它就可以正常运行。这是为什么?

它运行时的输出真的很奇怪,基本上我的 pids 元素为 0。

任何帮助将不胜感激。谢谢。

最佳答案

您的进程被OOM-Killer(内存不足)杀死。

静态双 vector [100000][10000]需要大约100000*10000*8字节的内存,即大约8GB。在向其中写入内容之前,不会物理分配此内存(内存复用)。如果您 fork() n 次并在每个进程中写入这些页面,则所需的内存约为 n*8GB,我认为这很快就会超过您的物理内存 + 交换空间。 dmesg 应该会向您显示一条与此相关的消息。

解决方案是,在 fork() 之前使用 mmap() 创建一个共享映射,并使所有进程在同一个数组上工作(如果这就是您的想法)需要):

double *vectors = mmap(NULL, 10000*100000*sizeof(double), 
PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

而不是

vectors[a][b]

访问

vectors[a*10000+b]

关于C 并发进程和静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35212840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com