malloc()不为大块内存分配内存

时间:2015-11-12 10:32:55

标签: c memory debian

我正在尝试创建一个分配内存的程序,然后用随机数据填充分配的内存,在本例中为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;
}

我试图在debian 8的虚拟机上运行它,内存为4 GB,交换量为570 mb。永远不会完全填充内存,永远不会触及交换空间。如果有人可以帮我解决这个问题,我会很高兴

1 个答案:

答案 0 :(得分:4)

您可能拥有32位系统,每个进程无法分配超过2 GB的内存。

如果malloc返回NULL,则意味着它无法分配内存。

所以你的程序行为是正常的。

另一种可能性是它根本无法找到足够大的自由连续内存块。

永远不会触及交换空间的原因可能是因为总有足够的可用内存,因为您的虚拟机有4GB的内存。 如果要使用交换空间,可以尝试分配大量较小的内存块,例如40倍100Mb;那么你能够分配的总记忆量也可能高于2100Mb。