1

Suppose there is 50 MB to allocate and there is this for loop which allocates memory in each iteration. What happens when the following for loop runs.

for(int i=0; i < 20; i++) {

int *p = malloc(5MB);

}

I was asked this question in an interview. Can someone guide me on this and direct me to the necessary topics which I must learn in order to understand such situations.

4

2 回答 2

2

如果这是一个使用虚拟内存的系统,那么情况显然比 malloc 简单地失败并返回空指针更复杂。在这种情况下,malloc 调用将导致在虚拟地址空间中分配内存页面。当访问此内存时,将导致页面错误,控制权将交给 os 内存管理器,这会将虚拟内存页面映射到物理内存页面。当可用的物理内存已满时,内存管理器通常会通过将当前在物理内存中的数据写入磁盘支持(或者如果它已经由磁盘文件支持,则简单地丢弃该数据),然后重新映射它来处理进一步的页面错误现在可用于最初导致页面错误的虚拟内存页面的物理内存。

Wikipedia 包含此过程的相当基本的概述(http://en.wikipedia.org/wiki/Paging),包括不同操作系统的一些实现细节。更详细的信息可从许多其他来源获得,例如。英特尔架构软件开发手册(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

于 2013-02-09T06:01:58.707 回答
0

根据 malloc 的文档(例如http://www.cplusplus.com/reference/cstdlib/malloc/),您将获得一个指向 5MB 内存块的指针(注意 malloc 的参数应该是所需的字节数,而不是 MB ..)前 10 次(如果存在与从 50MB 可用空间中取出的 malloc 空间相关的开销,则可能是 9 次),并且将返回指向该空间的指针。在这之后,5MB 的内存块将不可用,并且 malloc 将失败,返回一个空指针。

于 2013-02-08T16:03:44.047 回答