【发布时间】:2016-02-13 15:45:33
【问题描述】:
我正在尝试制作一个分配内存的程序,然后用随机数据填充分配的内存,在本例中为A,并多次执行此操作,然后以毫秒为单位打印填充 100 mb 所需的时间.
该程序应该每次分配 100 mb 的倍数。该程序应该做到这一点高达 9000 mb。我这样做的原因是为了演示操作系统在耗尽可用内存并使用交换空间时的行为。但是我在这样做时遇到了问题。
当我运行程序时,它的行为就像它应该做的那样,直到我达到 2100 mb 然后它停止分配内存,一段时间后错误处理程序启动并退出程序,因为 malloc() 返回 NULL。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <assert.h>
#include <unistd.h>
#define KILO 1024
#define MEGA (KILO*KILO)
#define INCREMENT 100
int diffTime(struct timeval * startTime, struct timeval * endTime) {
return ((endTime->tv_sec - startTime->tv_sec)*1000 + (endTime->tv_usec- startTime->tv_usec)/1000);
}
int createBigDatablock(long int storlek) {
char *arr = (char*) malloc(storlek*MEGA);
if (arr==NULL){
printf("Error: not allocating memory");
exit (-1);
}
for(int i = 0;i<storlek*MEGA;i++){
arr[i] = 'A';
}
fflush(stdin);
getchar();
free(arr);
return 0;
}
int main(void) {
long int i;
struct timeval startT, endT;
// struct timezone tzp;
for(i=INCREMENT;i<=9000;i=i+INCREMENT){
gettimeofday(&startT, NULL); //&tzp); /* hämta starttid */
createBigDatablock(i);
gettimeofday(&endT, NULL);//&tzp); /* hämta sluttid */
printf("Datablock %ld MB took %d msec\n",i, diffTime(&startT,&endT));
}
return 0;
}
我尝试在具有 4 GB 内存和 570 mb 交换空间的 debian 8 虚拟机上运行它。内存永远不会被完全填满,交换空间也永远不会被触及。如果有人能帮我解决这个问题,我会很感激的
【问题讨论】:
-
要么你在 32 位机器上,然后你运气不好,要么你的系统有一个进程可以使用多少内存的资源限制。使用
ulimit -m、ulimit -v和ulimit -d进行检查。