【发布时间】:2011-05-21 22:46:49
【问题描述】:
首先我注意到,当我使用 malloc 内存和 calloc 时,内存占用是不同的。我正在处理几 GB 的数据集。这个数据可以是随机的。
我希望我可以分配大量内存并将其中的任何随机数据转换为浮点数。但是,查看进程查看器中的内存占用量,显然没有占用内存(与我看到大脚印的 calloc 相比)。我运行了一个循环将数据写入内存,然后我看到内存占用量攀升。 我是否正确地说直到我初始化内存才真正声明它?
最后,在我通过了 1024*1024*128 字节(进程查看器中为 1024 MB)之后,我开始出现段错误。然而,Calloc 似乎将全部初始化为 1 GB。 为什么我在 for 循环中使用 malloc 在此数字 128MB 初始化内存时出现段错误,为什么内存占用显示为 1024MB?
如果 malloc 从内存中大量读取,然后从中读取我会得到什么(因为进程查看器在我初始化之前几乎没有显示足迹)?
最后有什么办法让我分配超过 4GB 的空间吗?我正在测试内存层次结构的性能。
#2 的代码:
long long int i;
long long int *test=(long long int*)malloc(1024*1024*1024);
for (i=0;i<1024*1024*128;i++)
test[i]=i;
sleep(15);
【问题讨论】:
-
Linux 使用“乐观内存分配策略”。一些信息:linux.die.net/man/3/malloc
-
直到我初始化它才真正声明内存是正确的,这是惰性评估的一个特例,它由操作系统处理。但是,第二个假设 1024*1024*128 bytes == 1Gb 是错误的。
-
@ruslisk - 我没有假设 1GB - 进程查看器显示 1GB 我在第二个关系中询问为什么它是 1GB,而内存只要求 128MB。感谢您的消息来源。这清除了一些事情。
-
看看这个来解释你所看到的opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html。这称为内存过度使用。
-
@Joshua:发布一些代码。