【问题标题】:Killed process by SIGKILLSIGKILL 杀死进程
【发布时间】:2012-01-31 13:58:17
【问题描述】:

我有一个进程在执行程序后立即被杀死。这是编译后的可执行文件的代码,它是一个小程序,它从标准输入(通常是描述性文件)中读取几个由数字表示的图,并使用 Prim 算法找到每个图的最小生成树(它没有显示结果,它只是找到了解决方案。

#include <stdlib.h>  
#include <iostream>  

using namespace std;

const int MAX_NODOS = 20000;
const int infinito = 10000;

int nnodos;
int nAristas;
int G[MAX_NODOS][MAX_NODOS]; 
int solucion[MAX_NODOS][MAX_NODOS];
int menorCoste[MAX_NODOS];
int masCercano[MAX_NODOS];



void leeGrafo(){
    if (nnodos<0 || nnodos>MAX_NODOS) {
        cerr << "Numero de nodos (" << nnodos << ") no valido\n";
        exit(0);
    }  
    for (int i=0; i<nnodos ; i++)
        for (int j=0; j<nnodos ; j++)
            G[i][j] = infinito; 
    int A,B,P;
    for(int i=0;i<nAristas;i++){
        cin >> A >> B >> P; 
        G[A][B] = P;
        G[B][A] = P;
    }   
}


void prepararEstructuras(){
    // Grafo de salida
    for(int i=0;i<nnodos;i++)
        for(int j=0;j<nnodos;j++)
            solucion[i][j] = infinito;
    // el mas cercaano 
    for(int i=1;i<nnodos;i++){
        masCercano[i]=0;
        // menor coste
        menorCoste[i]=G[0][i];
    }           
}

void prim(){
    prepararEstructuras();
    int min,k;  
    for(int i=1;i<nnodos;i++){
        min = menorCoste[1];
        k = 1;
        for(int j=2;i<nnodos;j++){
            if(menorCoste[j] < min){
                min = menorCoste[j];
                k = j;
            }
        }
        solucion[k][masCercano[k]] = G[k][masCercano[k]];
        menorCoste[k] = infinito;
        for(int j=1;j<nnodos;j++){
            if(G[k][j] < menorCoste[j] && menorCoste[j]!=infinito){
                menorCoste[j] = G[k][j];
                masCercano[j] = k;
            }       
        }           
    }
}

void output(){
    for(int i=0;i<nnodos;i++){
        for(int j=0;j<nnodos;j++)
            cout << G[i][j] << ' ';
        cout << endl;
    }
}

int main (){
    while(true){
        cin >> nnodos;
        cin >> nAristas;
        if((nnodos==0)&&(nAristas==0)) break;
        else{
            leeGrafo();
            output();
            prim(); 
        }
    }   
}

我知道我必须使用 strace 来查找正在发生的事情,这就是我得到的:

execve("./412", ["./412"], [/* 38 vars */] <unfinished ...>
+++ killed by SIGKILL +++
Killed

我正在运行 ubuntu,这是我第一次遇到这种类型的错误。该程序应该在从输入中连续读取两个零后停止,我可以保证我的图形描述文件中有。即使我执行程序而不将输入重定向到我的图形文件,也会出现问题。

【问题讨论】:

  • 你的程序逻辑很难理解。您的调试器对这种情况有什么看法?
  • 需要注意的是:您的固定大小的数组非常庞大。在发布时,您需要 > 3.2 GB... 这可能是问题所在。
  • @TomalakGeret'kal:程序逻辑无关;没有一个执行!
  • 那么我应该使用指向 int 的指针来解决内存问题吗?
  • @Gabe:这与 OP 以及以后将使用他的代码的任何人有关。

标签: c++ gcc ubuntu sigkill execve


【解决方案1】:

虽然我不能 100% 确定这是问题所在,但请查看全局数组的大小:

const int MAX_NODOS = 20000;

int G[MAX_NODOS][MAX_NODOS]; 
int solucion[MAX_NODOS][MAX_NODOS];

假设 int 是 4 个字节,您需要:

20000 * 20000 * 4 bytes * 2 = ~3.2 GB

首先,您甚至可能没有那么多记忆。其次,如果您使用的是 32 位,则操作系统可能根本不允许单个进程拥有那么多内存。

假设您使用 64 位(并假设您有足够的内存),解决方案是在运行时全部分配。

【讨论】:

  • 这可能就是答案。我建议将那些 int 数组更改为 short 看看是否有帮助。
  • 我现在可以看到这是我遇到的问题,我刚刚将 2000 更改为 20 并且它可以工作。请再问一个问题,如果我想继续使用数组进行图形表示而不更改为列表替代方案,我可以使用指向 int 的指针吗?而不仅仅是int。它会解决问题吗?还是我必须更改为必要的动态结构?
  • 如果您不小心,指针会占用更多空间,从而加剧问题。您可能根本没有足够的可用内存。你是在 32 位还是 64 位机器上?如果在 32 位上,您可能无法解决大小为 20,000 的问题(因为数据的总大小太接近 4 GiB)。如果您使用的是 64 位,则取决于您的虚拟内存限制,而不是 CPU 寻址的限制。
  • 在您的情况下,使用vector&lt;vector&lt;int&gt; &gt; 并在运行时构建它可能会更好。看起来您从输入中获取了节点数。所以在运行时构建它更有意义。
【解决方案2】:

您的数组 Gsolucion 每个都包含 400,000,000 个整数,在大多数机器上每个大约 1.6 GiB。除非你有足够的(虚拟)内存(3.2 GiB 和计数),并且有使用它的权限(尝试ulimit -d;这对于 MacOS X 10.7.2 上的bash 是正确的),你的进程将无法启动并且会被 SIGKILL 杀死(不能被捕获,并不是说进程真的在进行)。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2017-05-20
    • 2013-04-26
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多