当前位置: 首页 > 知识库问答 >
问题:

为什么malloc依赖于从某个阈值开始的mmap?

穆铭晨
2023-03-14

我阅读了一些关于malloc的知识,在malloc的手册页中发现了以下内容:

通常,malloc()使用sbrk(2)从堆中分配内存,并根据需要调整堆的大小。当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap(2)将内存分配为私有匿名映射。MMAP_THRESHOLD默认为128 kB,但是可以使用mallopt(3)进行调整。使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(请参见getrlimit(2))。

因此,基本上从阈值MMAP_THRESHOLD malloc开始,使用mmap

    null

共有1个答案

袁凌
2023-03-14

(1)通过匿名mmap获取的页面可以通过munmap发布,这就是glibc正在做的事情。因此,对于较小的分配,free将内存返回到进程堆(但将它们保留在进程内存中);对于大的分配,free将内存作为一个整体返回给系统。

(2)通过匿名mmap获取的页面直到您第一次访问它们时才被实际分配。在这一点上,内核必须将它们归零,以避免进程之间的信息泄漏。因此,是的,mmap获取的页面在第一次访问时要比通过进程堆回收的页面慢。您是否会注意到差异取决于您的应用程序

不使用mmap的代价是,释放的内存仍然被您的进程占用,系统上的其他进程无法使用。所以这最终是一种权衡。

 类似资料:
  • 问题内容: 平台之间可能有所不同,但是 当我使用gcc编译并运行下面的代码时,每次在ubuntu 11.10中获得0。 为什么即使有calloc,malloc的行为也是如此? 难道就意味着即使您不希望有时将值初始化为0,也会有不必要的性能开销吗? 编辑:哦,我以前的示例不是初始化,而是碰巧使用“新鲜”块。 我恰恰在寻找的是为什么它在分配一个大块时将其初始化: 但是,感谢您指出进行分配时存在安全原因

  • 所以我遇到了这个问题,依赖项的AAR元数据(META-INF/com/android/build/gradle/AAR metadata.properties)中指定的minCompileSdk(31)大于该模块的compileSdkVersion(android-30)。 在这里回答:指定的minCompileSdk(31) 我的问题是:我怎么知道是哪个依赖关系导致了这个问题?用户laalto是

  • 我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统。在最初的一个例子中,malloc无处不在,在第二个例子中,我实现了一个简单的池分配器,它只分配大块内存,并将部分内存返回给myalloc()调用。 我们注意到,使用malloc时会产生巨大的内存开销:在内存使用量最大的时候,malloc()代码对于1920x1080x16bpp映像需要大约170 MB的内存,而池分配器只分配48 MB,其

  • 我有自己的ADFS部署在网上。 我让它信任一些像SAMLtest.id这样的SPs在配置这个信任的过程中,我每次只填写两件事: SALM ACS 依赖方信任标识符(SAML发行者) 仅此而已。没有SP元数据文件,只有这两条信息。然后它工作,SAMLtest.id SP 被我的 ADFS 信任,我就可以执行 SSO 身份验证。同样的事情是与一些内部SP一起工作。 然后每个SP从其元数据文件中信任我的

  • 环境依赖 hiredis(redis异步库) redis mysql php >5.6 或者 php > 7.0 swoole >=1.9.17(建议升级到最新版本) (在编译swoole时加入—enable-async-redis,开启异步redis客户端, —enable-openssl开启openssl支持,—with-openssl-dir指定你的openssl目录) 注:openssl是

  • 问题内容: 在调试器中,这些显示为。 如何避免这种情况? 问题答案: 这些精度问题归因于浮点数的内部表示,您无法做很多事情来避免它。 顺便说一句,至少在使用现代C ++编译器时,在运行时打印这些值通常仍会导致正确的结果。对于大多数操作而言,这并不是什么大问题。