以下C ++为包含大量整数的对象的大型数组动态分配内存。
#include <iostream>
// VALUE1 > 1000000
class Int{
int* p = new int[VALUE1];
};
int main() {
// VALUE2 > 1000000
Int* ppi = new Int[VALUE2];
while(true){
}
}
据我所知,内存是在堆中分配的(很大)。程序向OS请求内存并处理内存分配。所以,我的问题是,为什么操作系统不会拒绝程序的内存(如果它没有可用的内存资源会导致程序崩溃)?它是操作系统的工作。以上程序使我的计算机冻结。如果重要的话,我在linux 4.9上有8 GB RAM。
答案 0 :(得分:1)
如果没有可用的内存资源,为什么操作系统不会拒绝程序内存?
操作系统可能会拒绝内存的过度分配,也可能不会。不否认过度分配并不是所有操作系统都必须做的事情。
允许分配意味着允许程序分配尽可能多的虚拟内存,并且在不再有可用的物理内存映射之前不会终止。仅在访问内存时映射物理内存。即使映射了所有物理内存,其中一些也可以交换到磁盘上。
on linux 4.9
Linux特别支持内存的过度分配。
上述程序使我的计算机冻结。
该程序是一个无限循环。如果循环没有优化为睡眠或被删除,那么它将无限期地要求处理器时间。如果只有1个CPU内核,那么根据调度算法,另一个进程可能需要一些时间才能获得CPU时间。