dlmalloc 文件头翻译

来源:互联网 发布:中华网络传奇一条龙 编辑:程序博客网 时间:2024/05/22 02:55
重要统计数据:
1. 支持size_t类型:
size_t 必须是和指针宽度相同的无符号类型。
(如果使用旧的操作系统声明size_t为有符号或者宽度和指针不同,可以用以前的版本(例如:2.72)支持这些)
2. 对齐(默认8字节对齐)
8字节对齐,对于当前的几乎所有的机器和编译器都是足够的。
以牺牲更多空间为代价,可以将MALLOC_ALIGNMENT定于的更宽(如果需要可以提升到128字节)。
3. 每个分配块的最小开销
4或8个字节(如果为4字节大小)
8或16字节 (如果为8字节大小)
如果定义宏:FOOTERS,每个malloced块有一个隐藏的字的开销保持大小和状态信息,以及附加的交叉检查字
4. 最小分配内存尺寸
4字节ptrs:16字节(包括开销)
8字节ptrs:32字节(包括开销)
即使对零字节的请求(即malloc(0)),也返回一个指针指向最小可分配大小的内存。
最大开销浪费(即,比malloc中请求多的额外字节数分配)小于或等于到最小大小,除了请求> = mmap_threshold通过mmap()服务,其中最糟糕的情况是浪费32字节加上系统页面的余数(最小mmap单位);通常为4096或8192字节。
5. 安全
malloc的安全性是针对恶意代码,强调错误代码调用malloc照成的影响(例如,释放不是当前malloc的空间或覆盖过去结束的块)
这个malloc保证即使使用错误,也不修改任何低于堆空间基址的内存位置(比如:静态变量).
除正常的工作外还检测大多数的free和recalloc。
所有的这些安全操作只存于malloc本身没有被破坏。
这个只是安全的一方面,并不能检测出所有问题。
如果宏FOOTERS被定义为非零,那么每个分配的块都附加一个检查字。这些检查字除了交叉执行对于其它执行malloc的程序是一样的,所以虚假的块不能够被释放。除了检测操作去阻止向静态存储区写数据,还通过拒绝执行破坏堆空间的free和realloc来提高安全性。这可以进一步提高安全性而牺牲时间和空间开销(注意:宏FOOTERS可能也是值得使用在MSPACES)
默认情况下检测到错误终止程序(通过调用abort())。通过定义宏PROCEED_ON_ERROR,可以不终止程序继续执行。在这种情况下,一个无效的free不会引起死机,以及malloc遇到坏的地址导致操作溢出时,通过丢掉已知内存的指针和索引来忽略这个错误地址。这适用于遇到问题需要继续执行的程序,这种程序可能会遇到内存不足的情况,因为丢弃的内存不会被回收。
如果不喜欢这两个宏,你可以定义宏CORRUPTION_ERROR_ACTION和宏USAGE_ERROR_ACTION来做其它事情。
如果你确认程序没有错误或漏洞,可以定义宏INSECURE为1,她可能回提供小的性能改进。
通过malloc_set_footprint_limit可以设置最大可申请空间。这个不是为了安全而设计的,但在提供安全性能是很有用
6. 线程安全
当USE_LOCKS定义为非零时,dlmalloc不是线程安全的。
当USE_LOCKS被定义时,每个malloc和free调用都被锁包围
默认情况下,如果在平台是有效且没有设置宏USE_SPIN_LOCKS=0,可以使用 a plain pthread mutex, win32 critical section, or a spin-lock。
如果宏USE_RECURSIVE_LOCKS被定义,使用递归版本 (它们不是基本功能所必需的,但在分层扩展中可能需要)。.
使用全局锁并不是特别快,而且可以是一个主要瓶颈。它的设计仅提供最小的保护在并发环境中,并为其提供依据扩展。 如果在并发程序中使用malloc,考虑改用nedmalloc(http://www.nedprod.com/programs/portable/nedmalloc/)或ptmalloc(参见http://www.malloc.de),其来源于这个malloc的版本。
系统要求:
MORECORE和/或MMAP / MUNMAP的任意组合。
这个malloc可以使用unix sbrk或任何仿真(使用调用CALL_MORECORE宏)和/或mmap / munmap或任何仿真(使用CALL_MMAP / CALL_MUNMAP调用)来获取和释放系统内存。 在大多数unix系统上,如果两个都运行得最好启用MORECORE和MMAP。 在Win32上,它使用模拟基于VirtualAlloc。 它还使用公共的C库函数像memset。


算法概述:
这不是曾经写过的最快,最节省空间,最可移植,或最可配置的malloc。但它是最快的同时也是最节省空间,可移植和可配置。在这些因素之间保持平衡实现良好malloc密集型程序的通用分配器。
在大多数情况下,这个malloc是一个最合适的分配器。 一般来说,对于请求它会选择最适合的现有块,以大约最近使用的顺序分配。 (这个策略通常保持低碎片。)。然而,对于小于256字节的请求,当最适合的块不存在时,通过优先选择使用申请空间相邻的空间以及通过以大约最近使用的顺序来分配内存块。(这些增强了一系列小分配的局部性。)对于非常大的请求(默认情况下> = 256Kb),它依赖于系统内存映射工具(如果支持的话)。
所有操作(除malloc_stats和mallinfo外)的执行时间都受size_t中的位数的常量因子的限制,不包括calloc或复制在realloc中的任何清除,或围绕MORECORE和MMAP的操作,其时间与 在实时应用程序中,您可以使用NO_SEGMENT_TRAVERSAL可选地抑制段遍历,即使在系统分配器返回非连续空间时,也可以确保有界执行,典型的是 携带更多内存和增加碎片的费用。
实现不是很模块化,严重过度宏。 也许有一天,所有C编译器将做一个好的工作,内联模块化代码,现在可以通过暴力扩张,但现在,他们似乎没有。
0 0
原创粉丝点击