快速池内存管理器

快速池内存管理器将内存分成一系列池。 它旨在提高发出大量小型分配请求的应用程序的堆性能。 当启用快速池内存管理器时,将在池中分配属于给定块大小范围的分配请求。 与此范围之外的请求相比,可以更快地处理这些请求。 在此范围之外的分配请求将以与缺省内存管理器相同的方式进行处理。

池由内存块 (称为扩展数据块) 组成,该内存块细分为大小一致的预定数量的较小块 (称为单元)。 可以将每个单元分配为一个内存块。 每个池都使用池号进行标识。 第一个池是池 1 ,第二个池是池 2 ,第三个池是池 3 ,依此类推。 第一个池最小,每个后继池的大小都等于或大于前一个池。

在初始化快速池内存管理器时,将确定每个池的池数和单元大小。

分配

当分配请求属于池定义的单元大小范围时,将从其中一个池分配单元。 将从最小的可能池中处理每个分配请求以节省空间。

当第一个请求进入池时,将为该池分配一个扩展数据块,并从该扩展数据块满足该请求。 稍后针对该池的请求也由扩展数据块满足,直到扩展数据块耗尽为止。 当扩展数据块耗尽时,将为池分配新的扩展数据块。

释放

通过 free 操作取消分配的内存块 (单元) 将添加到与包含该单元的池相关联的可用队列。 每个池都有一个空闲队列,其中包含已释放但尚未重新分配的单元。 来自该池的其他分配请求使用来自空闲队列的单元。

重新分配

如果重新分配的块的大小与原始块位于同一池中,那么将返回原始块而不进行任何数据移动。 否则,将分配请求大小的新块,将数据从原始块移动到新块,使用 free 操作将原始块返回到空闲队列,并将新块返回到调用者。

启用快速池内存管理器

缺省情况下,未启用快速池内存管理器。 通过调用 _C_Quickpool_Init() _C_Quickpool_Debug() 函数或通过设置以下环境变量来启用和配置此参数:
QIBM_MALLOC_TYPE=QUICKPOOL
QIBM_MALLOC_QUICKPOOL_OPTIONS=options

要使用缺省设置启用快速池内存管理器,不需要指定 QIBM_MALLOC_QUICKPOOL_OPTIONS 环境变量,仅需要指定 QIBM_MALLOC_TYPE=QUICKPOOL。 要使用用户指定的配置选项启用快速池内存管理器,请设置 QIBM_MALLOC_QUICKPOOL_OPTIONS=options,其中 options 是一个或多个配置选项的空白定界列表。

如果指定了 QIBM_MALLOC_TYPE=QUICKPOOL 环境变量并调用了_C_Quickpool_Init() 函数,则环境变量设置优先于_C_Quickpool_Init() 函数,_C_Quickpool_Init() 函数将返回 -1 值,表示已启用备用堆管理器。

如果指定了 QIBM_MALLOC_TYPE=QUICKPOOL 环境变量,并且调用了 _C_Quickpool_Debug() 函数来更改快速池内存管理器特征,那么在 _C_Quickpool_Debug() 函数的参数上指定的设置将覆盖环境变量设置。

配置选项

以下配置选项可用:

池: (C1 E1) (C2 E2) ...( Cn En )

此选项可用于指定要使用的池数,以及每个池的单元大小和扩展数据块单元计数。 下标值 n 指示池数。 n 的最小值为 1。 n 的最大有效值为 64。

值 C1 指示池 1 的单元大小, C2 指示池 2 的单元大小, Cn 指示池 n的单元大小等。 此值必须是 16 个字节的倍数。 如果指定的值不是 16 个字节的倍数,那么单元格大小将向上舍入为 16 个字节的下一个更大的倍数。 最小有效值为 16 ,最大有效值为 4096。

值 E1 指示池 1 的扩展数据块单元计数, E2 指示池 2 的扩展数据块单元计数, En 指示池 n的扩展数据块单元计数,依此类推。 该值指定单个扩展数据块中的单元格数。 该值可以是任何非负数,但由于体系结构约束,扩展数据块的总大小可能受限。 值为零表示实现可以选择较大的值。

此选项的缺省值为 "POOLS: (16 4096) (32 4096) (64 1024) (128 1024) (256 512) (512) (1024 256) (4096 256)"。 缺省值表示具有大小为 16,32,64,128,256,512,1024,2048 和 4096 字节的单元的 9 池。 每个扩展数据块中的单元数为 4096,4096,1024,1024,512,512,256,256 和 256。

MALLOC_INIT: N

此选项可用于指定将已分配内存的每个字节初始化为给定值。 值 N 表示 0 到 255 范围内的整数。

缺省情况下未启用此选项。

FREE_INIT: N

此选项可用于指定将释放内存的每个字节初始化为给定值。 值 N 表示 0 到 255 范围内的整数。

缺省情况下未启用此选项。

COLLECT_STATS

此选项可用于指定快速池内存管理器收集统计信息并在应用程序终止时报告这些统计信息。 当指定此选项时,快速池内存管理器通过调用 atexit(_C_Quickpool_Report) 来收集统计信息。 有关该报告中包含的信息的详细信息记录在 _C_Quickpool_Report(). 的描述中

缺省情况下未启用此选项。

可以指定任意数量的选项,并且可以按任意顺序指定这些选项。 空格是用于分隔配置选项的唯一有效定界符。 每个配置选项只应指定一次。 如果多次指定了配置选项,那么仅应用最终实例。 如果使用无效值指定了配置选项,那么将忽略该配置选项。

示例
ADDENVVAR ENVVAR(QIBM_MALLOC_QUICKPOOL_OPTIONS) LEVEL(*JOB) REPLACE(*YES) 
VALUE('POOLS:(16 4096) (32 4096) (64 1024) (128 1024) (256 512) (512 512) (1024 256) 
(2048 256) (4096 256)')

ADDENVVAR ENVVAR(QIBM_MALLOC_QUICKPOOL_OPTIONS) LEVEL(*JOB) REPLACE(*YES)
VALUE('POOLS:(16 1000) MALLOC_INIT:255 FREE_INIT:0 COLLECT_STATS')

第一个示例表示缺省配置值。 第二个示例说明了正在指定的所有选项。

相关函数

_C_Quickpool_Init() 功能允许启用快速池内存管理器。 _C_Quickpool_Init() 函数还指定要使用的池数,单元大小以及每个池的扩展数据块单元计数。

_C_Quickpool_Debug() 函数允许启用其他配置选项。

_C_Quickpool_Report() 函数用于报告内存统计信息。
注:
  1. 快速池内存管理器的缺省配置为发出大量小型分配请求的许多应用程序提供了性能改进。 但是,可以通过修改缺省配置来实现其他收益。 在修改缺省配置之前,请熟悉应用程序的内存需求和使用情况。 可以使用 COLLECT_STATS 选项来启用快速池内存管理器,以微调快速池内存管理器配置。
  2. 由于内存需求和使用情况的变化,某些应用程序可能无法从快速池内存管理器使用的内存分配方案中获益。 因此,建议不要启用快速池内存管理器以供系统范围使用。 为了获得最佳性能,请按应用程序启用并配置快速池内存管理器。
  3. 允许创建多个具有相同大小单元的池。 这对于执行许多类似大小的分配的多线程应用程序很有用。 当没有争用时,将使用所请求大小的第一个池。 在第一个池上发生争用时,快速池内存管理器会从任何其他大小相等的池中分配单元以最大限度减少争用。

相关信息