我在Linux中从终端运行C程序,我收到消息“已完成(已杀死)”。从获得的输出中我看到执行或多或少总是在同一点被杀死。我也在处理大量数据,我正在计算机本地执行该程序。
在控制台中写入ulimit -a我得到以下信息:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 29117
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 29117
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
但我看到正常值。
我不知道该做什么才能完成整个执行。我已经优化了代码并释放了内存,但我得到了同样的问题“(已杀)”。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define T 100
#define dt 1.e-4
#define itmax (T/dt)
#define a 0.27
#define K1 0.15
#define K2 1.e2
#define pp 1.e3
#define s 2
#define TWOPI (6.2831853071795864769252867665590057683943387987502)
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
double ran2(double *idum){
int j;
long k;
static long idum2=123456789;
static long iy=0;
static long iv[NTAB];
float temp;
if (*idum <= 0) {
if (-(*idum) < 1) *idum=1;
else *idum = -(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) {
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum < 0) *idum += IM1;
if (j < NTAB) iv[j] = *idum;
}
iy=iv[0];
}
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum < 0) *idum += IM1;
k=idum2/IQ2;
idum2=IA2*(idum2-k*IQ2)-k*IR2;
if (idum2 < 0) idum2 += IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j] = *idum;
if (iy < 1) iy += IMM1;
if ((temp=AM*iy) > RNMX) return RNMX;
else return temp;
}
double RANDN(double seed){
return sqrt(-2.0*log(ran2(&seed)))*cos(TWOPI*ran2(&seed));
}
double rnd(){
return (double) rand() / (double) RAND_MAX;
}
int main(){
int j, rows, d;
d=0;
double *t;
t=(double *) malloc((itmax)*sizeof(double));
double **x, **y;
x=(double **)malloc(2*sizeof(double*));
y=(double **)malloc(2*sizeof(double*));
for(rows=0; rows<2; rows++){
x[rows]=(double*)malloc(itmax*sizeof(double));
y[rows]=(double*)malloc(itmax*sizeof(double));
}
double p, L, C, bC, Qx, Qy;
double bx, by Qbx, Qby, KK, KKK, dt2;
srand(time(NULL));
t[0]=0;
for(rows=0; rows<2; rows++){
x[rows][0]=10+rows*i;
y[rows][0]=1300;
}
L=s*0.0001;
KK=K1*K1;
KKK=K2*K2;
dt2=0.5*dt;
C=KK*KKK;
bC=a*C;
for(j=0; j<=itmax; j++){
p=pp-x[0][j]+x[1][j];
Qx=a+bC/(KK+C)-a*x[0][j]*y[0][j];
Qy=y[1][j]-y[0][j];
bx=x[0][j]+dt*Qx+L*RANDN(rnd()+2);
by=y[0][j]+dt*Qy+L*RANDN(rnd()+2);
Qbx=a+bC/(KK+C)-a*bx*by-a*bx;
Qby=y[0][j]-y[1][j];;
x[0][j+1]=(bx+x[0][j])/2+(Qbx+Qx)*2;
y[0][j+1]=(by+y[0][j])/2+(Qby+Qy)*2;
Qx=a+bC/KK-a*x[1][j]*y[1][j];
Qy=y[1][j];
bx=x[1][j]+dt*Qx;
by=y[1][j]+dt*Qy;
Qbx=a+C/(KK+C)-a*bx*by-a*bx;
Qby=by*(y[1][j]-y[0][j]);
x[1][j+1]=(bx+x[1][j])/2+(Qbx+Qx)*dt2+L*RANDN(rnd()+2);
y[1][j+1]=(by+y[1][j])/2+(Qby+Qy)*dt2+L*RANDN(rnd()+2);
if(j==d){
d+=T;
printf("%G %G %G %G %G\n",t[j],x[0][j],x[1][j],y[0][j],y[1][j]);
}
}
return 0;
}
答案 0 :(得分:3)
您几乎肯定缺少 swap 分区,或者您有一些其他实用程序监视可用可用内存的数量,因此您的程序已杀死因为消耗太多内存,直到没有免费的 ram 为止。
您可以使用 htop 或 conky 清楚地查看问题。
如果你有一个 swap 分区,那么你的系统会尝试从/向磁盘交换内存,这很可能冻结他们。这是一个更糟糕的情况,因为在大多数情况下,您可以采取的唯一措施是让重启:根据我的经验,当系统冻结时它不再响应任何键盘输入。
在我的系统上,您的可执行文件需要 2m26s 来填充 50%的 8GB RAM ,不计算其他正在运行的程序占用的额外 32%。
您可能希望使用内存泄漏分析工具(例如 valgrind )来检查潜在的泄漏,或者只是手动检查源代码。如果你不能减少它的内存占用,那么你唯一的选择是寻找一个功能更强大的机器,它有一个更大的 RAM 池。
答案 1 :(得分:2)
使用-g
编译并链接调试信息,然后在gdb
等调试器的控制下运行程序,并观察它停止的位置。您应该看到哪一行源代码会导致系统杀死您的程序的问题。
$ gcc -O2 -g -o my_program my_program.c
$ gdb my_program
gdb> run
如果您的程序需要命令行参数,请在run
命令
gdb> run arg1 arg2