我一直在阅读有关Linux的记忆条件的信息,而《男人》页面的以下段落让我思考:

默认情况下,Linux遵循乐观的内存分配策略。这意味着,当malloc()返回非零件时,无法保证内存确实可用。这是一个非常糟糕的错误。如果事实证明该系统不在记忆中,则臭名昭著的OOM杀手将杀死一个或多个过程。 [...

考虑到操作员的新实施最终会在某个时候致电Malloc,是否保证了新的实际上会抛弃Linux?如果没有,如何处理这种显然无法检测到的错误情况?

有帮助吗?

解决方案

这取决于; 您可以配置内核的过度设置 使用vm.overcommit_memory。

赫伯·萨特(Herb Sutter)几年前讨论了 这种行为实际上不合格C ++标准:

“在某些操作系统(包括Linux)上,内存分配始终会成功。完全停止。分配如何始终成功,即使确实没有请求的内存?分配本身只是记录了内存的请求的原因;在封面下,(物理或虚拟)内存实际上并未使用真实的备份存储,直到实际使用内存为止。

“请注意,如果New直接使用操作系统的设施,那么New将始终成功,但是任何以后的无辜代码(如BUF [100] ='C';都会抛出或失败或停止。从标准C ++的角度来看,这两种效果都不合格,因为C ++标准要求如果新的记忆无法实现足够的内存,就必须失败(这不会),并且像BUF [100] ='c'这样的代码不应抛出异常或以其他方式失败(这是这样)可能)。”

其他提示

您无法在软件中处理纯洁和简单的软件。

对于您的应用程序,您将收到一个完全有效的指针。一旦您尝试访问它,它将在内核中生成页面故障,内核将尝试为其分配一个物理页面,如果不能...繁荣。

但是如您所见,所有这些发生在内核内,您的应用程序看不到。如果是关键系统,则可以禁用系统上的过度承诺。

我认为malloc仍然可以返回null。之所以如此之所以如此,是因为可用的系统内存(RAM +交换)与过程地址空间中的数量之间存在差异。

例如,如果您在标准X86 Linux上要求Malloc从MALLOC要求3GB的内存,则肯定会返回null,因为鉴于给出的内存量不可能给用户空间应用程序提供。

如果我错了,请原谅我,但不会试图使分配的内存归零足以保证您需要的每个字节吗?甚至只是写入最后一个字节,如果记忆真的不是您的对,它将引发例外吗?

如果这是真的,您可以尝试写入内存的最后(和第一个?)字节,然后看看它是否正常,如果不这样做,则可以从malloc返回null。

是的,有一个保证新的最终会投掷。不管过度使用,地址空间的数量都是有限的。因此,如果您不断分配内存,迟早会用完地址空间,而新的将被迫投掷。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top