为什么在malloc代码运行之前分配内存?

时间:2014-11-23 17:24:42

标签: c multithreading ubuntu memory-management pthreads

对于一个项目,我们必须编写一个简单的程序,它生成一个子线程,批量打印顶部输出,让子线程分配一些内存,并再次打印顶部输出。直观地说,两个状态之间的顶部输出应该存在差异,因为在它们之间分配了内存。但是,在我的所有测试中,似乎子线程分配的内存在子线程生成时已经分配,​​因此顶部输出之间没有区别。

如果我分配的内存多于项目中指定的数量,我确实看到了不同,但是我的教授说应该与给定的数量存在差异。另外,如果在主线程中分配了内存,我看到了区别,但是当分配代码被移动到子线程时,所有内存都在创建子线程时分配。这是一个更简单的程序,可以重现这个问题:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * allocate_memory(void * param) {

    getchar();
    malloc(4096 * 4);
    malloc(4096 * 4);
    malloc(4096 * 4);
    malloc(4096 * 4);
    getchar();
}

int main (int argc, char *argv[]) {

    pthread_t child;

    printf("PID: %d\n",getpid());
    pthread_create(&child, NULL, &allocate_memory, NULL);
    pthread_join(child, NULL);
}

使用gcc 4.4.5进行编译并在第一次暂停时运行top -p <pid>,第二次暂停会在我们正在使用的VM(ubuntu 10.10)中的系统上产生相同的输出。这是一个编译器或操作系统优化,还是其他的事情?

1 个答案:

答案 0 :(得分:2)

加载进程时,操作系统会将初始堆分配给进程;如果无法满足分配,则通过从操作系统请求更多内存来扩展堆。

请参阅http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/以获取解释。

您看到的是进程的初始堆分配,而不是进程从该堆分配的总内存。