gpt4 book ai didi

c - Malloc, Calloc 测试我的内存极限

转载 作者:行者123 更新时间:2023-12-02 22:32:00 25 4
gpt4 key购买 nike

我正在尝试编写一个 c 程序来测试我的系统上有多少内存。我计划在各种不同的条件下运行它:

  1. 启用交换
  2. 禁用交换并将过量使用 (/proc/sys/vm/overcommit_memory) 设置为 false
  3. 禁用交换并将过量使用 (/proc/sys/vm/overcommit_memory) 设置为 true
  4. 在系统上运行的虚拟机中

我这样做是为了更多地了解内存分配在系统的实际内存和虚拟内存限制下的表现。

我在一台有 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 的 block (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 MBytes”

这是我对 4GB Ram 和 8GB swap 的期望。顺便说一句,由于它正在交换到磁盘,因此在 4GB 之后打印速度要慢得多。

最佳答案

您不能通过巨大的分配来确定物理内存,然后减少分配大小直到成功。

这只会确定最大可用虚拟内存块的大小。

您需要循环分配物理页面大小(也将是虚拟页面大小)的 block ,直到分配失败。使用这样一个简单的程序,您无需担心跟踪您的分配 - 操作系统将在程序退出时返回它们。

关于c - Malloc, Calloc 测试我的内存极限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12088597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com