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

为什么在malloc代码运行之前分配内存?,c,multithreading,ubuntu,memory-management,pthreads,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);
}
#包括
#包括
#包括
#包括
void*分配内存(void*参数){
getchar();
马洛克(4096*4);
马洛克(4096*4);
马洛克(4096*4);
马洛克(4096*4);
getchar();
}
int main(int argc,char*argv[]){
pthread_t子线程;
printf(“PID:%d\n”,getpid());
pthread_创建(&child,NULL,&allocate_内存,NULL);
pthread_join(child,NULL);
}

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

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

有关示例的解释,请参见


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

因此,从本质上讲,如果进程在堆中已经有足够的空间用于我请求的分配,那么顶部的输出不会显示任何差异?我相信是这样的。内存管理依赖于系统,但操作系统尽可能少地参与频繁的微小分配是有意义的,因此它提供了一个“合理”的块来开始,并且进程在该块用完时请求另一个块。通过'malloc()`的标准库处理本地堆管理。