对于一个项目,我们必须编写一个简单的程序,它产生一个子线程,批量打印顶部输出,让子线程分配一些内存,并再次打印顶部输出。直观地说,两个状态之间的最高输出应该有差异,因为内存正在被分配在它们之间。但是,在我所有的测试中,似乎子线程分配的内存在派生子线程时已经分配,所以顶级输出之间没有区别。为什么在malloc代码运行之前分配内存?
如果我分配的内存超过项目中指定的数量,我确实看到了差异,但是我的教授说应该与给定的数量有差异。另外,如果在主线程中分配内存,我会看到差异,但是当分配代码移至子线程时,所有内存都将在创建子线程时分配。下面是该再现问题简单的程序:
#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>
和第二次暂停产生在我们使用的是虚拟机的系统上相同的输出(Ubuntu的10.10)。这是编译器还是操作系统优化,还是其他的事情?
所以,从本质上讲,如果进程在堆中有足够的空间用于我请求的分配,最高输出不会显示出差异? – 2014-11-23 18:20:38
我相信如此。内存管理是依赖于系统的,但是对于一个操作系统来说,在频繁的微小分配中尽可能少地涉及它是有意义的,所以它给出了一个“合理”的块,并且当该块过期时,该进程请求另一个块。标准库通过'malloc()'处理本地堆管理。 – Clifford 2014-11-23 19:31:59