我创建了一个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。
非常感谢任何帮助。谢谢。
答案 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]