如何创建用C语言定义的新malloc()
函数?
我甚至没有关于如何执行此操作的精简提示,如何使用物理空间映射虚拟空间地址,要遵循什么算法?我知道malloc()效率不高,因为它可能导致碎片。因此可以创建一些有效的东西。即使效率不高,如何实现一个天真的C malloc函数呢?
最近在接受采访时被问及。
答案 0 :(得分:7)
Wikipedia实际上提供了各种malloc实现的完美摘要,包括针对特定条件优化的实现,以及了解有关实现的更多信息的链接。
http://en.wikipedia.org/wiki/C_dynamic_memory_allocation
通用分配器。 GNU C库(glibc)使用基于dlmalloc的分配器。
为了避免锁争用,jemalloc为每个CPU使用单独的“竞技场”。在多线程应用程序中测量每秒分配数量的实验表明,这使得它与线程数呈线性关系,而对于phkmalloc和dlmalloc,性能与线程数成反比。
Hoard独占使用mmap,但是以64千字节的块为单位管理内存,称为超级块。 Hoard的堆在逻辑上分为单个全局堆和多个每处理器堆。此外,还有一个线程本地缓存,可以容纳有限数量的超级块。通过仅分配本地每线程或每处理器堆上的超级块,并将大多数空的超级块移动到全局堆,以便其他处理器可以重用它们,Hoard保持低碎片,同时通过线程数实现近线性可伸缩性
每个线程都有本地存储空间用于小分配。对于大型分配,可以使用mmap或sbrk。由Google开发的malloc TCMalloc具有用于本地存储死线程的垃圾收集。对于多线程程序,TCMalloc被认为是glibc的ptmalloc的两倍多。
dmalloc(未涵盖维基百科)
调试内存分配或dmalloc库被设计为系统的malloc,realloc,calloc,free和其他内存管理例程的替代品,同时提供在运行时可配置的强大调试工具。这些设施包括内存泄漏跟踪,围栏后写入检测,文件/行号报告以及统计数据的一般记录。
答案 1 :(得分:3)
我认为这是An example in Chapter 8.7 of C Programming Language book中malloc的一个很好的例子: