【问题标题】:Malloc allocates memory more than RAMMalloc 分配的内存多于 RAM
【发布时间】:2011-09-21 17:39:02
【问题描述】:

我刚刚执行了一个在 12 MB 机器中 malloc 13 MB 的程序(QEMU Emulated!)。不仅如此,我什至浏览了内存并在其中填充了垃圾......

void 
large_mem(void) 
{
  #define LONGMEM  13631488
  long long *ptr = (long long *)malloc(LONGMEM);
  long long i;
  if(!ptr) {
     printf("%s(): array allocation of size %lld failed.\n",__func__,LONGMEM);
     ASSERT(0);
  }
  for(i = 0 ; i < LONGMEM ; i++ ) { 
    *(ptr+i)=i;
  }
  free(ptr);
}

这怎么可能?我期待一个分段错误。

【问题讨论】:

  • 哇!刚刚意识到forloop中的代码是错误的......仍然仍然......!为什么没有段错误?

标签: c++ c memory-management malloc


【解决方案1】:

它被称为虚拟内存,它是为您的程序分配的。它不是您称为 RAM 的真实内存。

虚拟内存也有最大限制,但高于 RAM。它由您的操作系统实现(和定义)。

【讨论】:

  • 所以没有最大限制之类的?
  • 当我不断请求操作系统时,新页面会被换入吗?
  • @raj:理论上的限制是由指针的大小决定的。实际上,与指针大小产生的任何地址空间相比,大多数操作系统都会为您提供更少的内存。而且,是的,如果您分配的内存多于机器中实际存在的内存,您将获得交换。
  • 哇!就像我在和你们聊天一样.. 如此快速的回复.. C 社区太快了。 :) 非常感谢..
  • 愚蠢的是,我必须等待 10 分钟才能在 SO 中接受你的答案。:P
【解决方案2】:

这称为惰性分配。

大多数操作系统(如 Linux)都有延迟分配内存模型,其中返回的内存地址是虚拟地址,实际分配只发生在访问时。操作系统假定它能够在访问时提供此分配。

ma​​lloc 分配的内存在程序真正接触到它之前,是不会被实际内存支持的。

同时,由于 calloc 将内存初始化为 0,因此您可以确信操作系统已经使用实际 RAM(或交换)支持分配。

尝试使用calloc,除非您的交换文件/分区足够大以满足请求,否则它很可能会使您内存不足。

【讨论】:

  • 我认为他的意思是访问时间。!
【解决方案3】:

听起来你的操作系统是swapping pages

分页是大多数虚拟内存实现的重要组成部分 现代通用操作系统,允许他们使用 不适合物理随机访问的数据的磁盘存储 内存 (RAM)。

换句话说,操作系统正在使用您的一些硬盘空间来满足您的 13 MB 分配请求(以极大的速度为代价,因为硬盘比 RAM 慢得多 )。

【讨论】:

    【解决方案4】:

    除非虚拟化操作系统具有可用的交换,否则您遇到的称为 overcommit,它基本上存在是因为在具有虚拟内存和需求/复制的系统中管理资源的简单方法-write pages 不是为了管理它们。过度使用很像银行借出的钱比实际拥有的钱多——它似乎工作了一段时间,然后事情就崩溃了。设置 Linux 系统时您应该做的第一件事是使用以下命令修复此问题:

    echo "2" > /proc/sys/vm/overcommit_memory
    

    这只会影响当前运行的内核;您可以通过在/etc/sysctl.conf 中添加一行来使其永久化:

    vm.overcommit_memory=2
    

    【讨论】:

    猜你喜欢
    • 2017-04-14
    • 2012-12-26
    • 2013-01-28
    • 2014-02-20
    • 2013-02-23
    • 2014-02-02
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多