为什么不是malloc填满内存?

我有以下代码:

#include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int data = 0; char *byte = (char *)malloc(sizeof(char)*1000000000); byte[999999999] = 'a'; printf("%c",byte[999999999]); scanf("%d",&data); return 0; } 

在程序启动之前和scanf之前查看内存,我希望内存增加1 GB。 为什么不这样呢?

编辑:我补充说

 byte[999999999] = 'a'; printf("%c",byte[999999999]); 

该程序输出a

默认情况下,Linux懒惰地分配物理内存,第一次访问。 你对malloc调用将分配一大块虚拟内存,但是还没有任何物理内存页面被映射到它。 第一次访问未映射页面将导致错误,内核将通过分配和映射一个或多个物理内存页面来处理错误。

要分配所有的物理内存,您必须在每个页面上至少访问一个字节; 或者你可以绕过malloc ,直接进入操作系统

 mmap(0, 1000000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0); 

注意使用MAP_POPULATE来填充页表,即立即分配物理内存。 根据手册,这只适用于相当新的Linux版本。

大多数(所有?)Linux系统过度使用内存。 这意味着一个malloc永远不会失败,即使你使用特定的提交策略来保留大量的内存。 如果你预留太多内存,比如虚拟内存,它可能会在某些情况下失败。

你没有得到真正的内存地址,只有一个指针,它承诺指向足够的内存使用你。 如果您尝试使用该系统,系统将为您分配内存,因此您必须写信给系统以表示您确实需要该内存。

使用该系统是因为许多程序不需要它们预留的存储器或在另一时间需要它。

编辑后,您只能访问一个页面,所以您只能保留一个页面。 你需要访问每个页面来获取所有的内存。

当你问的时候, malloc没有给你提供所有的1000000000 。 它只是1st页,直到你开始访问它(读/写),你会得到分配休息。

Linux, malloc请求将立即扩展虚拟地址空间,但在访问它之前不会分配物理内存页面。