Memory allocators form interesting case studies in the engineering of infrastructure software. I started writing one in 1987, and have maintained and evolved it (with the help of many volunteer contributors) ever since. This allocator provides implementations of the the standard C routines malloc(), free(), and realloc(), as well as a few auxiliary utility routines. T ### 内存分配器(Memory Allocator) #### 引言 内存分配器是基础设施软件工程中的一个有趣案例。本文作者 Doug Lea 自1987年开始编写一个内存分配器,并一直维护和改进它(在此过程中得到了许多志愿者贡献者的帮助)。这个内存分配器提供了标准C语言中的 `malloc()`, `free()`, 和 `realloc()` 函数的实现,以及一些辅助性的实用函数。 该内存分配器没有特定的名字,通常被称为“Doug Lea 的 Malloc”,或者简称为 dlmalloc。其源代码被放置在公共领域内,可以从指定的 FTP 地址获取(ftp://g.oswego.edu/pub/misc/malloc.c),并在多个平台上得到广泛的应用。例如,在某些 Linux 发行版中作为默认的本地内存分配器;在很多常用软件包中编译并覆盖原有的内存分配器;同时也在各种 PC 环境和嵌入式系统中使用。 最初编写此内存分配器的原因是由于作者在编写大量依赖动态内存分配的 C++ 程序时发现,这些程序运行速度较慢且消耗过多的内存资源。这是由于当时所使用的操作系统(主要是 SunOS 和 BSD)上的内存分配器存在一些特性导致的。为了克服这些问题,作者最初编写了一些特定用途的 C++ 分配器,通过重载 `new` 运算符为不同的类提供服务。这些特殊用途的分配器在一篇关于 C++ 内存分配技术的文章中有详细介绍,该文章发表于1989年的《C++ 报告》。 然而,随着作者继续编写通用的编程支持类(在1986年至1991年间,作者是 GNU C++ 库 libg++ 的主要作者),他意识到为每个新类编写特定的分配器并不是一个好的策略。因此,需要一种更广泛的解决方案来应对这一挑战。 #### 内存分配器的关键技术 内存分配器的核心在于有效地管理可用内存,并为程序请求的内存块提供服务。以下是内存分配器实现中的一些关键技术点: 1. **内存池管理**:内存分配器通常会预分配大块内存(即内存池),然后从中分配和回收较小的内存块。这样可以减少与系统调用相关的开销,并提高分配和回收效率。 2. **内存碎片处理**:内存分配器需要有效地管理内存碎片,避免因碎片化而无法分配足够大的连续内存块。这通常涉及到合并相邻的空闲内存块或使用特殊的算法来减小碎片的影响。 3. **多线程支持**:现代应用程序往往需要在多线程环境中运行。因此,内存分配器需要具备良好的并发性能,能够在多线程环境下高效地分配和回收内存。 4. **可配置性**:为了满足不同应用场景的需求,内存分配器应具备一定的可配置性,允许用户根据实际需求调整内存分配策略。 5. **错误检测与处理**:内存分配器还需要能够检测和处理内存泄漏、溢出等错误情况,以确保程序的稳定性和安全性。 6. **性能优化**:高效的内存分配器能够显著提升程序的执行效率。这包括减少分配和释放内存的时间开销、最小化对 CPU 缓存的影响等。 #### 结论 Doug Lea 的内存分配器不仅是一个技术上成功的项目,也是内存管理领域的经典案例之一。它不仅解决了当时存在的性能问题,还为后来的开发者提供了一个强大的工具,并激发了更多针对内存管理和优化的研究。随着计算机科学的发展,内存分配器的设计和技术也在不断演进,以适应更加复杂的应用场景。
剩余9页未读,继续阅读
- 粉丝: 2
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助