【问题标题】:How to get the largest available chunk of memory that can be allocated? [duplicate]如何获得可以分配的最大可用内存块? [复制]
【发布时间】:2015-06-14 21:58:59
【问题描述】:

如何在不返回out of memory 的情况下获得我的应用程序在一次malloc 调用中可以分配的最大大小(连续)(以字节为单位)? (最大的可用块)

P.S.:如果我想分配它,如果我不想分配它,我想要一个通用的答案(所以这个问题不需要重新提出)。

【问题讨论】:

  • 您是要实际分配内存,还是只需要找出最大大小是多少?
  • 在任何合理的现代系统上,操作系统可能会考虑使用整个硬盘进行溢出。您要考虑到这一点吗?
  • Jongware,我认为 OP 想知道,如何找出 ram 中 CONTINUOUS 内存块的最大大小,我不认为,这个问题涉及任何分页问题。
  • @icbytes 总结正确
  • 在具有 overcommit 或惰性分配的系统上,您 对几乎所有答案感到惊讶。 “可用内存”是当今虚拟内存系统中定义不明确的概念。例如,它可能会在您请求该值后更改毫秒。

标签: c memory memory-fragmentation


【解决方案1】:

我想您是在询问(有点)现代桌面或服务器操作系统。

问题是:返回结果时,任何答案都可能已经无效。原因是其他进程、线程、内存碎片等。 正如其他人已经在 cmets 中所述,操作系统甚至可能报告比可用内存更多的内存 - 包括交换。这个想法是分配的内存可能只被一个进程稀疏使用,因此只会根据需要提供实际访问的内存页面,malloc() 本身不会提前保留任何内存。

分配尽可能多的内存通常也不是一个好主意,因为这可能会导致过度交换或饥饿/颠簸其他进程。因此,只需分配您实际需要的内存即可。

**结论:**忘记它!分配你需要的内存,不多也不少。如果您需要动态内存,请考虑动态结构,例如列表和树,或使用 realloc()(但要慎重使用)。

旁注:

在返回 NULL 之前,不要尝试增加分配的块大小。这很容易导致碎片化,您甚至可能无法分配之前最大的块大小(出于与上述类似的原因)。


对于嵌入式操作系统,可能会有完全不同的答案。

【讨论】:

  • 另外,如果过度使用,它实际上可能永远不会返回NULL
  • @FilipeGonçalves:是的,这增加了为什么这是无稽之谈的原因。
【解决方案2】:

以下代码将提供一个大概的答案,尤其是对于实时操作系统中的实时确定性内存分配器。它不适用于通用操作系统:

#include <stdio.h>
#include <stdlib.h>

#define INCR 100000

int main(void){
    unsigned long i;
    for(i=1;;i=i+INCR) {
        void *ret = malloc(i);
        if (ret) {
            free(ret);
        }
        else {
            printf("malloc could not allocate memory of size: %ld bytes!\n", i);
            return 0;
        }
    }
}

【讨论】:

  • 只有在极少数情况下才有用,最大尺寸是 2 的幂。但它不会找到最大 999Mb。
  • 好的,那么可以尝试一些更小的增量!
  • 另外,根据系统分配器的工作方式,运行一堆malloc()free() 调用实际上可能会改变答案。
  • malloc() 可以做惰性分配。使用calloc() 可能会更好
  • 现代操作系统没有合适的解决方案。您的方法在某种程度上遵循“海森堡不确定性原理”:观察会改变观察到的物体 - 充其量。更糟糕的是:一个好的编译器甚至可能检测到您根本不使用内存,甚至不调用 malloc 和 free。 (如果被问到,我会怀疑 gcc 会这样做)。
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2010-10-30
  • 2010-11-15
  • 1970-01-01
  • 2017-05-14
  • 2023-03-20
相关资源
最近更新 更多