【问题标题】:Why doesn't the operating system deny the memory for this program?为什么操作系统不拒绝该程序的内存?
【发布时间】:2017-09-14 07:03:38
【问题描述】:

以下 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。

【问题讨论】:

  • 我猜电脑死机是因为它忙于在while(true){} 中无所事事。由于从未使用过pppi,它们可能已被编译器优化掉。
  • 你确定编译器不只是优化分配,因为你什么都不做吗?
  • 或者可能变成了一个虚拟内存请求,在页面被访问之前不会提交页面。
  • 我没有提供优化标志,因为我只是在摆弄以检查会发生什么。它冻结了整个计算机,我不得不强制关机。编译器是否优化了动态内存分配?
  • 您应该检查内核过度使用值设置为(默认为 0)/proc/sys/vm/overcommit_memory...

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


【解决方案1】:

如果程序没有可用的内存资源,为什么操作系统不拒绝向程序提供内存?

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

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

在 linux 4.9 上

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

以上程序让我的电脑死机。

程序是一个无限循环。如果循环没有优化为睡眠或删除,那么它将无限期地要求处理器时间。如果只有 1 个 CPU 内核,那么根据调度算法,另一个进程可能需要一些时间才能获得 CPU 时间。

【讨论】:

  • 严格来说,允许编译器删除该循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2015-12-31
  • 2012-12-02
  • 2020-07-04
  • 2015-04-27
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多