我正在尝试编写 ac 程序来测试我的系统上有多少内存。我打算在各种不同的条件下运行它:
- 启用交换
- 禁用交换并且过度使用 (/proc/sys/vm/overcommit_memory) 设置为 false
- 禁用交换并且过度使用 (/proc/sys/vm/overcommit_memory) 设置为 true
- 在系统上运行的虚拟机内部
我这样做是为了更多地了解内存分配在系统真实和虚拟内存的限制下如何表现。
我在具有 4GB RAM 和 8GB Swap 的机器上运行它。
我目前拥有的是这样的:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr;
int mb = 1048576;
long long int i;
for (i = 0; i < 1000000000000; i++)
{
printf("Trying to allocate %lld MBytes\n", i * 10 * sizeof(int) );
ptr = (int*) calloc(10 * mb, sizeof(int));
if ( ptr == 0 ) {
// clean up
free(ptr);
printf("Ran out of memory\n");
return 1;
}
}
}
我希望这将继续分配 40mb 的块(sizeof(int) 在我的系统上为 4)。Calloc 会将内存初始化为零。当没有更多可用内存时,它将终止程序并释放内存。
当我运行它时,它会继续超出我的记忆范围。它最终在打印以下行时死了:“尝试分配 5707960 MBytes。” (表示将近 6000 GB 的内存。)
任何人都可以弄清楚我要去哪里错了。
感谢@Blank Xavier 指出以这种方式分配时应考虑页面文件大小。
我修改了代码如下:
int main(void)
{
int *ptr;
int mb = 1048576;
int pg_sz = 4096;
long long int i;
for (i = 0; i < 1000000000000; i++)
{
printf("Trying to allocate %lld MBytes\n", i * pg_sz * sizeof(int) / mb );
ptr = (int*) calloc(pg_sz, sizeof(int));
if ( ptr == 0 ) {
// clean up
free(ptr);
printf("Ran out of memory\n");
return 1;
}
}
}
现在它轰炸了打印:
“尝试分配 11800 MB”
这就是我对 4GB Ram 和 8GB 交换的期望。顺便说一句,它在 4GB 之后打印速度要慢得多,因为它正在交换到磁盘。