Memory management 正在请求超出可用内存的内存

Memory management 正在请求超出可用内存的内存,memory-management,dynamic,virtual-memory,Memory Management,Dynamic,Virtual Memory,假设有50MB要分配,有一个for循环在每次迭代中分配内存。运行以下for循环时会发生什么情况 对于(int i=0;i

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

对于(int i=0;i<20;i++) {

}


我在一次采访中被问到这个问题。有没有人能在这方面指导我,并指导我了解这些情况所必须学习的必要主题。

根据malloc的文档(例如),在前10次,你会得到一个指向5MB内存块的指针(注意malloc的参数应该是所需的字节数,而不是MB…)(如果在50MB的可用空间中存在与malloc’ed空间相关的开销,则可能是9次),并将返回指向此空间的指针。在此之后,5MB内存块将不可用,并且malloc将失败,返回空指针。

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


Wikipedia包含此过程的基本概述(),包括不同操作系统的一些实现细节。更多详细信息可从其他许多来源获得,例如英特尔体系结构软件开发手册()

50MB是指物理内存还是可用地址空间?(假设这是在具有虚拟内存的系统上。)面试问题不一定有这样简单的答案。@millimoose:谢谢你的回答。很抱歉,我没有提到这50 MB是指物理内存。而且系统也有虚拟内存。我在回答中提到虚拟内存会处理多余的内存分配。面试官告诉我我很满意,但想让我详细解释一下。你能给我一些进一步的建议吗?谢谢你的回复。我在malloc中提到5MB只是为了方便计算。
int *p = malloc(5MB);