繁体   English   中英

为什么在重新分配小块时没有分配大块内存失败

[英]Why does allocating large chunks of memory fail when reallocing small chunks doesn't

此代码导致x指向大小为100GB的内存块。

#include <stdlib.h>
#include <stdio.h>

int main() {
    auto x = malloc(1);
    for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);
    while (true); // Give us time to check top
}

虽然这段代码失败了。

#include <stdlib.h>
#include <stdio.h>

int main() {
    auto x = malloc(1024ULL*1024*100*1024);
    printf("%llu\n", x);
    while (true); // Give us time to check top
}

那么你在成功的内存中分配更少的内存:

for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);

最后一个realloc是:

x = realloc(x, 1023 * (1024ULL*1024*100));

相比于:

auto x = malloc(1024 * (1024ULL*100*1024));

也许这就是你的记忆界限 - 最后的100M打破了骆驼的背部?

我的猜测是,系统的内存大小小于您尝试分配的100 GiB。 虽然Linux确实过度使用内存,但它仍然无法满足超出其要求的要求。 这就是第二个例子失败的原因。

另一方面,第一个例子的许多小增量低于该阈值。 因此,当内核知道您不需要任何先前的内存时,它们中的每一个都会成功,因此它没有迹象表明它将无法支持那100个额外的MiB。

我相信来自进程的内存请求失败的阈值是相对于可用的RAM,并且可以调整(虽然我不记得究竟如何)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM