gpt4 book ai didi

C 当尝试calloc最大可用内存时,没有NULL返回

转载 作者:行者123 更新时间:2023-11-30 15:08:06 25 4
gpt4 key购买 nike

我试图初始化尽可能多的内存(所有可用内存),而不是休眠 10 秒并释放它。Calloc 初始化它,它的大小超过 7800 MB,而我的内存是 8GB,所以我认为它可以完成工作,但是当 OOM killer 出现并杀死时(只要我正在阅读论坛和其他内容),问题就开始了它。所以进程被杀死而不是 calloc 返回 NULL。有什么解决办法吗?如何在杀死之前停止它或如何在内存不足时返回 NULL?

int main() {

int *pointer;
int megabajti=1048576; //MB
int velikost_strani=4096; //page size
long long int i=0;
while(1)
{
pointer=calloc(velikost_strani,sizeof(int));
printf("Trenutno alociram %lld MB\n",i*velikost_strani*sizeof(int)/megabajti);
if(pointer==NULL)
{
printf("Max velikost je %lld MB\n",i*velikost_strani*sizeof(int)/megabajti);
free(pointer);
sleep(10);
}
++i;
}
return 0;
}

最佳答案

一般来说,malloc() 和类似函数不会仅因为物理 RAM 不足而返回 NULL。他们通常甚至不知道您有多少物理 RAM,只会尝试从操作系统获取更多物理 RAM,通常使用 mmap() (或 brk()),但这只是 mmap() 的包装。

mmap() 也不会仅仅因为物理 RAM 不足而返回失败,而是会尝试使用虚拟内存。这在 UNIX 系统中很常见,并且通常不可能直接使用物理内存而不是虚拟内存。 OOM-killer 只是 Linux 对虚拟内存无法处理后备存储需求时发生的情况的特定实现。消除 OOM killer 的一种方法是分配更多的交换空间(出于这个原因和类似的原因,我发现保留大量交换空间通常是一个好主意)。

mmap()malloc() 返回失败的最常见情况是它们因内部原因无法处理分配,例如虚拟地址不足空间(这在 64 位系统上很少见)。

话虽这么说,如果您想避免虚拟内存的潜在复杂性,则存在更直接处理物理 RAM 的机制。 mlock() 是 POSIX 定义的一种机制,它将一定量的已分配 RAM 固定到物理页,这样做通常是为了避免交换的性能和/或安全影响。然而,它仅限于 super 用户,并且通常只允许锁定总共少量的内存。请参阅 its manpage了解详情。

在 Linux 上,您还可以 tweak the overcommit behavior 。我必须承认我自己从未尝试过,但行为#2(如链接中所述)似乎 promise 了某种与您似乎正在寻找的行为类似的行为。

但是,这些机制都不是“普通的”,因此,如果您正在寻找一种方法来限制对物理内存的分配,并且在您不亲自管理的系统上可移植且可重现,那么您就可以很简单,我可能不走运。

关于C 当尝试calloc最大可用内存时,没有NULL返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642482/

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