- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
malloc
的典型实现使用brk
/sbrk
作为从操作系统申请内存的主要方式。但是,他们还使用 mmap
来获取大分配的 block 。使用 brk
而不是 mmap
真的有好处吗,还是只是传统?用 mmap
做这一切不是同样有效吗?
(注意:我在这里互换使用 sbrk
和 brk
因为它们是同一个 Linux 系统调用 brk
的接口(interface)。)
作为引用,这里有一些描述 glibc malloc
的文档:
GNU C 库引用手册:GNU 分配器
https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html
glibc wiki:Malloc 概述
https://sourceware.org/glibc/wiki/MallocInternals
这些文档描述的是,sbrk
用于声明小分配的主要区域,mmap
用于声明次要区域,mmap
也用于为大型对象(“比页面大得多”)声明空间。
同时使用应用程序堆(使用 sbrk
声明)和 mmap
引入了一些可能不必要的额外复杂性:
Allocated Arena - the main arena uses the application's heap. Other arenas use
mmap
'd heaps. To map a chunk to a heap, you need to know which case applies. If this bit is 0, the chunk comes from the main arena and the main heap. If this bit is 1, the chunk comes frommmap
'd memory and the location of the heap can be computed from the chunk's address.
[Glibc malloc 派生自ptmalloc
,派生自dlmalloc ,始于 1987 年。]
jemalloc联机帮助页 ( http://jemalloc.net/jemalloc.3.html) 是这样说的:
Traditionally, allocators have used
sbrk(2)
to obtain memory, which is suboptimal for several reasons, including race conditions, increased fragmentation, and artificial limitations on maximum usable memory. Ifsbrk(2)
is supported by the operating system, this allocator uses bothmmap(2)
and sbrk(2), in that order of preference; otherwise onlymmap(2)
is used.
因此,他们甚至在这里说 sbrk
不是最理想的,但他们仍然使用它,即使他们已经不厌其烦地编写代码以使其在没有它的情况下也能正常工作。
[jemalloc 的编写始于 2005 年。]
更新:再考虑一下,关于“按优先顺序”的那一点给了我一条询问线。为什么优先顺序?他们只是使用 sbrk
作为回退以防 mmap
不受支持(或缺少必要的功能),还是进程有可能进入某种状态使用 sbrk
而不是 mmap
?我会查看他们的代码,看看我是否能弄清楚它在做什么。
我问这个问题是因为我正在用 C 语言实现一个垃圾收集系统,到目前为止我认为没有理由使用 mmap
之外的任何东西。不过,我想知道我是否遗漏了什么。
(在我的例子中,我还有一个避免 brk
的额外原因,那就是我可能需要在某些时候使用 malloc
。)
最佳答案
系统调用 brk()
的优点是只有一个数据项来跟踪内存使用情况,这也与堆的总大小直接相关。
自 1975 年的 Unix V6 以来,它一直采用完全相同的形式。请注意,V6 支持 65,535 字节的用户地址空间。因此,没有太多考虑管理超过 64K 的数据,当然不是 TB。
使用 mmap
似乎是合理的,直到我开始想知道如何改变或添加垃圾收集可以使用 mmap 但没有重写分配算法.
这能很好地与 realloc()
、fork()
等一起使用吗?
关于c - 在 malloc 中,为什么要使用 brk?为什么不直接使用 mmap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768549/
如果我在 C 中调用一个函数并传入一个结构(对那些 C++ 读者来说不是通过指针或引用),它会复制该对象。如果我传入一个包含数组的结构,它会复制该数组(如教授在类里面所说)。但是,如果我传入一个包含对
在 vim 等中,您可以使用 CTRLA 和 CTRLX 增加或减少光标所在的数字。然而,这会增加总数,但我想简单地增加光标正下方的数字。这有点难以描述,所以这就是我的意思: Ctrl+A usage
我正在将 Spring 4.3.2 项目升级到 Spring 5.1.5。我的一个测试用例开始因错误而失败。 ClassNotFoundException: org.hibernate.propert
我想在 Java 中分配一个直接 IntBuffer,比如说 10 亿个元素(64 位系统)。我知道的唯一方法是创建一个直接 ByteBuffer 并将其视为直接 IntBuffer。但是,4*1,0
我正在寻找特定的打印机或某些打印机上存在的技术(接口(interface)、标准、协议(protocol)),这使得可以使用 AJAX 从 Web 浏览器实现直接打印。 这意味着打印机必须: 网络接口
我正在寻求实现删除确认表单的最佳实践建议。 除其他选项外,以下页面包含删除按钮... /website/features/f/123 ...当点击一个简单的表单时,会在以下 url 下加载: /web
我正在使用直接 Web 远程处理库在我的应用程序中执行一些 ajax 调用。我有一个问题,我认为归结为服务调用的延迟响应。以下是我认为有问题的部分代码。问题出在 getDefaultReviewerT
我想替换 Javascript confirm() 函数以允许自定义按钮而不是 Yes/Cancel。我尝试搜索,但所有解决方案都是事件驱动的,例如 jquery 对话框(代码不等待响应但它是事件驱动
我知道有几个类似的问题,但是,其中的示例并没有说明问题,或者我无法从中获利 - 我真可耻。 所以我的问题是在带有 GUI 的简单应用程序中加载图像。例如: 我在 "D:\javaeclipseprog
我想用不同的颜色为表格的行着色,所以我正在使用它 table#news tr:nth-child(even) { background-color: red; } table#news
下面的测试代码不起作用 from("direct:start").setExchangePattern(ExchangePattern.InOnly).threads(5).delay(2000).b
我在 python 中实现的第一个项目之一是对棒渗流进行蒙特卡罗模拟。代码不断增长。第一部分是棍子渗滤的可视化。在宽度*长度的区域中,使用随机起始坐标和方向绘制具有一定长度的直棒的定义密度(棒/面积)
跟踪直接文件下载的最佳方法是什么?我找到了一些解决方案,例如这个: http://www.gayadesign.com/diy/download-counter-in-php-using-htacce
我在一个线程中有一个直接的 ByteBuffer(堆外),并使用 JMM 给我的一种机制将它安全地发布到另一个线程。 happens-before 关系是否扩展到由 ByteBuffer 包装的 na
当我测试直接 java.nio.ByteBuffer 的读取性能时,我注意到绝对读取平均比相对读取快 2 倍。此外,如果我比较相对读取与绝对读取的源代码,除了相对读取维护和内部计数器外,代码几乎相同。
我知道这个问题已经被问了无数次,并且在很多情况下都得到了答案。我相信我已经阅读了其中的大部分内容。不幸的是,我在这上面能找到的一切 简单说明 ElementRef.nativeElement不好,不要
回到一些 C 语言工作。 我的许多函数看起来像这样: int err = do_something(arg1, arg2, arg3, &result); 根据意图,结果由函数填充,返回值是调用的状态
当我将 XML 提交到 https://secure-test.WorldPay.com/jsp/merchant/xml/paymentService.jsp 时: Personalised
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我的 Angular 路由行为有问题。刷新或输入的 url 像/user 总是将我重定向到/home。我还在 index.html 文件中设置了 。通过单击导航菜单按钮一切正常。但是一旦我尝试刷新页面
我是一名优秀的程序员,十分优秀!