2014-11-23 76 views
0

对于一个项目,我们必须编写一个简单的程序,它产生一个子线程,批量打印顶部输出,让子线程分配一些内存,并再次打印顶部输出。直观地说,两个状态之间的最高输出应该有差异,因为内存正在被分配在它们之间。但是,在我所有的测试中,似乎子线程分配的内存在派生子线程时已经分配,​​所以顶级输出之间没有区别。为什么在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)。这是编译器还是操作系统优化,还是其他的事情?

回答

2

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

查看http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/查看例子的解释。

你看到的是分配给进程的初始堆,而不是堆中进程分配的总内存。

+0

所以,从本质上讲,如果进程在堆中有足够的空间用于我请求的分配,最高输出不会显示出差异? – 2014-11-23 18:20:38

+1

我相信如此。内存管理是依赖于系统的,但是对于一个操作系统来说,在频繁的微小分配中尽可能少地涉及它是有意义的,所以它给出了一个“合理”的块,并且当该块过期时,该进程请求另一个块。标准库通过'malloc()'处理本地堆管理。 – Clifford 2014-11-23 19:31:59

相关问题