2012-08-10 113 views
3

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

我甚至没有像如何做到这一点的elflike暗示,如何映射虚拟空间地址与物理空间,遵循什么算法?我知道malloc()不是很有效,因为它可能导致碎片。因此可以创建高效的东西。即使效率不高,如何实现一个朴素的C malloc函数?

最近在采访中被问到。

+0

您将需要操作系统特定的API。除了我想知道为什么malloc会效率低下。 – SuperSaiyan 2012-08-10 16:44:06

+0

在K&R的结尾附近有一个相当不错的实现。 – cnicutar 2012-08-10 16:44:41

+1

我认为这对于小型分配是低效的 – Gir 2012-08-10 16:44:48

回答

7

维基百科实际上提供的各种malloc实现,包括具体条件优化的人的一个很好的总结,与链接了解更多关于执行一起。

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

dlmalloc

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

jemalloc

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

Hoard memory allocator

囤地使用mmap独占,但在64千字节称为超级块的块管理内存。 Hoard的堆在逻辑上分为单个全局堆和每个处理器堆。此外,还有一个线程本地缓存,可以容纳有限数量的超级块。通过仅从本地每线程或每处理器堆上的超级块中分配,并将大部分空的超级块移动到全局堆以便其他处理器可以重用,Hoard保持低碎片化,同时通过线程数达到接近线性的可伸缩性。

tcmalloc

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

dmalloc不属于维基百科

调试内存分配或dmalloc库已被设计成在更换下降为系统的malloc,realloc的,释放calloc,免费,而其他的内存管理同时提供在运行时可配置的强大调试工具。这些设施包括内存泄漏跟踪,围栏后写入检测,文件/行号报告以及统计信息的一般记录等。

+0

+1。感谢大家的链接:) – SuperSaiyan 2012-08-10 17:00:31

+0

如何选择适合特定应用程序的内存分配需求的malloc实现会影响性能,这一点令人惊讶。另外,在开发/测试时使用类似* dmalloc *的内容对于发现内存管理错误在变成隐患的错误之前至关重要。 – 2012-08-10 17:02:53