C并发进程和静态变量

时间:2016-02-04 22:22:56

标签: c

我创建了一个c程序,它可以在一个进程中完成所有操作。例如,它按顺序逐个文件读取,并输出一些内容。我不得不使用一个名为vectors的巨大数组,所以我声明它是静态的(因为它给了我一个seg错误)。静态双向量[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]);
}

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

到目前为止,我已经被杀死了#34;当我运行上面的消息时,但是一旦我注释掉静态向量数组,它运行正常。那是为什么?

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

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

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

static double vectors[100000][10000]需要大约100000 * 10000 * 8字节的内存,大约8GB。在写入内存之前,内存不会被物理分配(内存过量使用)。如果您fork() n次并在每个进程中写入这些页面,则所需的内存大约为n * 8GB,这会快速超过您的物理内存+交换,我假设。 dmesg应该向您显示有关此内容的消息。

解决方案是,在mmap()之前使用fork()创建共享地图,并使所有进程在同一个数组上运行(如果这是您需要的):

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]