首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux中的malloc() --“不能保证内存真的可用”?

问Linux中的malloc() --“不能保证内存真的可用”?
EN

Stack Overflow用户
提问于 2015-02-01 20:15:32
回答 2查看 1.2K关注 0票数 6

我正在制作一个游戏,在这个游戏中,世界被分成几块描述世界的数据。我将块保留在一个动态分配的数组中,因此在初始化世界的数据结构时必须使用malloc()。

阅读 man page,有如下注意事项:

默认情况下,Linux遵循乐观内存分配策略。这意味着当malloc()返回非空时,不能保证内存确实可用。如果系统内存不足,一个或多个进程将被OOM杀手杀死。有关更多信息,请参见proc(5)中的/proc/sys/vm/overcommit_memory和/proc/sys/vm/oom_adj的描述,以及Linux内核源文件文档/vm/overcommit-计。

如果Linux被设置为使用乐观内存分配,那么这是否意味着它并不总是返回我在调用malloc()时请求的全部内存

我阅读了乐观的内存分配,并通过修改内核禁用了它,但我不想这样做。

那么,是否有一种方法来检查程序是否分配了所请求的金额?

EN

回答 2

Stack Overflow用户

发布于 2015-02-01 20:45:52

这不是您需要从应用程序的角度来处理的事情。不希望被"OOM杀手“杀死的随机进程的用户将通过以下方式禁用过度提交

代码语言:javascript
复制
echo "2" > /proc/sys/vm/overcommit_memory

这是他们的选择不是你的。

但从另一个角度看,这并不重要。典型的“推荐”交换量是如此荒谬,以至于任何合理数量的malloc都不会有物理存储来支持它。但是,您可以轻松地分配这么多(即使是强制的MAP_POPULATE或手动地触摸所有这些),以使系统在几个小时/几天/每周的时间内保持切换。如果您想要的内存量将陷入系统交换,则没有常规的方法要求系统通知您并给出一个错误。

整个情况一团糟,但作为应用程序开发人员,您在修复程序中的角色只是正确使用malloc并检查空返回值。剩下的责任在于发行版和内核维护人员。

票数 7
EN

Stack Overflow用户

发布于 2015-02-01 20:20:05

与malloc不同,您可以通过mmap直接分配必要的内存,使用MAP_POPULATE建议内核立即映射页面。

代码语言:javascript
复制
#include <sys/mman.h>

// allocate length bytes and prefault the memory so 
// that it surely is mapped
void *block = mmap(NULL, length, PROT_READ|PROT_WRITE, 
       MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE,
       -1, 0);

// free the block allocated previously
// note, you need to know the size
munmap(block, length);

但是更好的选择是,通常将世界保存到一个文件中,因此您可以直接从一个文件中mmap内容:

代码语言:javascript
复制
int fd = open('world.bin', 'r+');
void *block = mmap(NULL, <filesize>, PROT_READ|PROT_WRITE,
    MAP_SHARED, fd, 0);

文件world.bin从地址block开始映射到内存中;对内存的所有更改也将透明地写入文件--如果有足够的内存,就不必担心,因为linux将负责自动地映射页面。

请注意,除非您定义了某个特性测试宏,否则这些标志中的一些是未定义的:

只有当定义了_BSD_SOURCE或_SVID_SOURCE时,才定义某些标志常量。(需要_GNU_SOURCE也就足够了,具体地要求这个宏更符合逻辑,因为这些标志都是Linux特有的。)相关标志是:MAP_32BIT、MAP_ANONYMOUS (和同义词MAP_ANON)、MAP_DENYWRITE、MAP_EXECUTABLE、MAP_FILE、MAP_GROWSDOWN、MAP_HUGETLB、MAP_LOCKED、MAP_NONBLOCK、MAP_NORESERVE、MAP_POPULATE和MAP_STACK。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28267364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档