Malloc分配的内存多于RAM

时间:2011-09-21 17:39:02

标签: c++ c memory-management malloc

我刚刚在一台12 MB的机器上执行了一个mallocs 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);
}

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

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

这称为惰性分配。

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

malloc 分配的内存不会被实际内存支持,直到程序实际触及它为止。

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

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

答案 2 :(得分:4)

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

  

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

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

答案 3 :(得分:2)

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

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

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

vm.overcommit_memory=2