c++ - 为什么操作系统不拒绝为该程序分配内存?

标签 c++ memory memory-management operating-system

下面的 C++ 为包含大整数数组的对象动态分配内存。

#include <iostream>
// VALUE1 > 1000000
class Int{
int* p = new int[VALUE1];

};

int main() {
// VALUE2 > 1000000
Int* ppi = new Int[VALUE2];
while(true){
    }
}

我的理解是内存分配在堆中(很大)。程序向操作系统请求内存并处理内存分配。所以,我的问题是,如果操作系统没有可用的内存资源,为什么操作系统不拒绝程序的内存(这会使它崩溃)?这是操作系统的工作。上面的程序让我的电脑死机。如果重要的话,我在 linux 4.9 上有 8 GB RAM。

最佳答案

why doesn't the OS deny memory to the program if it doesn't have the available memory resource?

操作系统可能会拒绝过度分配内存,也可能不会。不否认过度分配并不是所有操作系统都必须做的事情。

允许过度分配意味着允许程序分配任意多的虚拟内存,并且在不再有空闲物理内存可映射之前不会终止。物理内存只有在内存被访问时才会被映射。即使所有物理内存都已映射,其中一些也可以交换到磁盘上。

on linux 4.9

Linux 尤其支持内存过度分配。

The above programs make my computer freeze.

程序是一个无限循环。如果循环没有优化到 sleep 状态或被移除,那么它将无限期地请求处理器时间。如果只有 1 个 CPU 核心,则根据调度算法,另一个进程可能需要一些时间才能获得 CPU 时间。

关于c++ - 为什么操作系统不拒绝为该程序分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43472198/

相关文章:

ios - iPad 在将数据下载到 Core Data 模型 20 分钟后崩溃

C memcpy() 一个函数

Java对象创建和内存大小

java - 获取 java.lang.OutOfMemoryError : GC overhead limit exceeded while reading excel file

c++ - auto 关键字无法确定 C++ 中的类型

c++ - 这个双重递归调用如何显示数据 C++

c++ - size_t i < _str.length 在 C++ 中创建无限循环

c++ - 为什么只能在头文件中实现模板?

sockets - 远程文件内存映射

performance - Julia ,为什么函数内的循环会发生内存分配?