请求内存超过可用内存

时间:2013-02-08 00:50:28

标签: memory-management dynamic virtual-memory

假设有50 MB要分配,并且有这个for循环,它在每次迭代中分配内存。当以下for循环运行时会发生什么。

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

int *p = malloc(5MB);

}

我在接受采访时被问到这个问题。有人可以指导我,并指导我必须学习的必要主题,以便了解这些情况。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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