【问题标题】:Implement a user-defined malloc() function?实现用户定义的 malloc() 函数?
【发布时间】:2012-08-08 00:06:36
【问题描述】:

如何创建一个用 C 语言定义的新 malloc() 函数?

我什至没有关于如何做到这一点的精灵提示,如何将虚拟空间地址与物理空间映射,遵循什么算法?我确实知道 malloc() 效率不高,因为它会导致碎片。所以可以创造一些有效的东西。即使效率不高,如何实现一个朴素的 C malloc 函数?

最近在采访中被问到。

【问题讨论】:

  • 您需要特定于操作系统的 API。此外,我想知道为什么 malloc 效率低下..
  • 在 K&R 接近尾声的某个地方有一个相当不错的实现。
  • 我认为小分配效率低
  • @Thrustmaster:在许多领域,malloc 的默认实现不如许多平台的自定义实现高效。例如,对于高度并发的应用程序,尝试避免错误共享的实现可以显着提高性能。针对目标平台优化的实现也可以比通用实现(例如嵌入式设备与高内存服务器)更高效。
  • @Thrustmaster:添加了一个答案,其中包含一个非常相关的 Wikipedia 条目的摘要。它概述了 malloc 实现尝试优化的不同类型的事物。那篇 Wikipedia 文章是深入了解 malloc 世界的绝佳起点。

标签: c memory-management operating-system malloc


【解决方案1】:

实际上,维基百科很好地总结了各种 malloc 实现,包括针对特定条件优化的实现,以及了解更多有关实现的链接。

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation

dlmalloc

通用分配器。 GNU C 库 (glibc) 使用基于 dlmalloc 的分配器。

jemalloc

为了避免锁争用,jemalloc 为每个 CPU 使用单独的“arenas”。在多线程应用程序中测量每秒分配数的实验表明,这使其与线程数成线性关系,而对于 phkmalloc 和 dlmalloc 而言,性能与线程数成反比。

Hoard memory allocator

Hoard 仅使用 mmap,但以 64 KB 的块(称为超级块)管理内存。 Hoard 的堆在逻辑上分为单个全局堆和多个每个处理器的堆。此外,还有一个线程本地缓存,可以容纳有限数量的超级块。通过仅从本地每个线程或每个处理器堆上的超级块分配,并将大部分为空的超级块移动到全局堆以便它们可以被其他处理器重用,Hoard 保持低碎片,同时实现与线程数接近的线性可伸缩性.

tcmalloc

每个线程都有用于小分配的本地存储。对于大型分配,可以使用 mmap 或 sbrk。 TCMalloc 是 Google 开发的 malloc,具有用于本地存储死线程的垃圾收集。对于多线程程序,TCMalloc 被认为是 glibc 的 ptmalloc 的两倍以上。

dmalloc维基百科未涵盖

调试内存分配或 dmalloc 库被设计为替代系统的 malloc、realloc、calloc、free 和其他内存管理例程,同时提供在运行时可配置的强大调试工具。这些功能包括内存泄漏跟踪、fence-post 写入检测、文件/行号报告和一般统计记录。

【讨论】:

  • 选择适合您特定应用程序的内存分配需求的 malloc 实现如何影响性能是非常令人惊讶的。此外,在开发/测试时使用像 dmalloc 这样的东西对于在内存管理错误变成潜在错误之前发现它们是必不可少的。
【解决方案2】:

我认为这是 An example in Chapter 8.7 of C Programming Language book 中 malloc 的一个很好的例子:

【讨论】:

    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多