对于一个项目,我们必须编写一个简单的程序,它生成一个子线程,批量打印顶部输出,让子线程分配一些内存,并再次打印顶部输出。直观地说,两个状态之间的顶部输出应该存在差异,因为在它们之间分配了内存。但是,在我的所有测试中,似乎子线程分配的内存在子线程生成时已经分配,因此顶部输出之间没有区别。
如果我分配的内存多于项目中指定的数量,我确实看到了不同,但是我的教授说应该与给定的数量存在差异。另外,如果在主线程中分配了内存,我看到了区别,但是当分配代码被移动到子线程时,所有内存都在创建子线程时分配。这是一个更简单的程序,可以重现这个问题:
#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)中的系统上产生相同的输出。这是一个编译器或操作系统优化,还是其他的事情?
答案 0 :(得分:2)
加载进程时,操作系统会将初始堆分配给进程;如果无法满足分配,则通过从操作系统请求更多内存来扩展堆。
请参阅http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/以获取解释。
您看到的是进程的初始堆分配,而不是进程从该堆分配的总内存。