_C_Quickpool_Init ()- 初始化快速池内存管理器

格式

#include <stdlib.h>
int _C_Quickpool_Init(unsigned int numpools, unsigned int *cell_sizes, unsigned int *num_cells);

语言级别

扩展

线程安全

描述

调用 _C_Quickpool_Init() 函数时,对同一激活组中的内存管理器函数 (malloccallocreallocfree) 的所有后续调用都将使用快速池内存管理器。 此内存管理器为某些应用程序提供了改进的性能。

快速池内存管理器将内存分成一系列池。 每个池会拆分为多个大小相同的单元格。 池数,每个池中的单元大小以及每个池扩展数据块中的单元数都是使用 _C_Quickpool_Init() 函数设置的。 环境变量也可用于配置此支持 (参考部分 环境变量)。

假设用户要定义四个池,每个池包含 64 个单元。 第一个池将具有大小为 16 个字节的单元; 第二个池将具有大小为 256 个字节的单元; 第三个池将具有大小为 1024 个字节的单元; 第四个池将具有大小为 2048 个字节的单元。 当发出存储请求时,内存管理器首先将该请求分配给池。 内存管理器将请求中的存储器大小与给定池中的单元大小进行比较。

在此示例中,第一个池满足大小在 1 到 16 字节之间的请求; 第二个池满足大小在 17 到 256 字节之间的请求; 第三个池满足大小在 257 到 1024 字节之间的请求,第四个池满足大小在 1025 到 2048 字节之间的请求。 任何大于最大单元大小的请求都将通过缺省内存管理器进行分配。

分配池后,将检查池的可用队列。 每个池都有一个空闲队列,其中包含已释放但尚未重新分配的单元。 如果空闲队列上有一个单元,那么将从空闲队列中除去该单元并返回; 否则,将从池的当前扩展数据块中检索该单元。 扩展数据块是作为一个块分配的单元的集合。 最初,池没有扩展数据块。

当第一个请求进入池时,将为该池分配一个扩展数据块,并从该扩展数据块满足该请求。 该扩展数据块还会满足该池的后续请求,直到该扩展数据块耗尽为止。 当扩展数据块耗尽时,将为池分配新的扩展数据块。 如果无法分配新的扩展数据块,那么将假定存在内存问题。 将尝试使用缺省内存管理器来分配存储器。 如果尝试不成功,那么将返回 NULL 值。

数字池
要用于快速池内存管理器的池数。 此参数的值可以介于 1 和 64 之间。
单元格大小
无符号整数值的数组。 数组中的条目数等于 numpools 参数上指定的数目。 每个条目指定给定池的单元中的字节数。 这些值必须是 16 字节的倍数。 如果指定的值不是 16 个字节的倍数,那么单元格大小将向上舍入为 16 个字节的下一个更大的倍数。 最小有效值为 16 个字节,最大有效值为 4096 个字节。
单元格数
无符号整数值的数组。 数组中的条目数等于 numpools 参数上指定的数目。 每个条目指定对应池的单个扩展数据块中的单元数。 每个值可以是任何非负数,但由于体系结构约束,每个扩展数据块的总大小可能受限。 值为零表示实现应选择较大的值。

以下是对上述示例的 _C_Quickpool_Init() 的调用:

unsigned int cell_sizes[4] = { 16, 256, 1024, 2048 };
unsigned int cells_per_extent[4] = { 64, 64, 64, 64 };
rc = _C_Quickpool_Init(4,                       /* number of pools            */
                       cell_sizes,              /* cell sizes for each pool   */
                       cells_per_extent);       /* extent sizes for each pool */

返回值

以下列表显示了 _C_Quickpool_Init() 函数的返回值:
重大安全事件数量
成功
-1
已为此激活组启用备用内存管理器。
-2
为控制结构分配存储器时出错。
-3
指定的池数无效。
-4
从无效激活组调用了 _C_Quickpool_Init()
-5
运行 _C_Quickpool_Init() 时发生意外异常。

示例

以下示例使用 _C_Quickpool_Init() 来启用快速池内存分配。
#include <stdlib.h>
#include <stdio.h>
int main(void) {
  char *p;
  unsigned int cell_sizes[2]       = { 16, 64 };
  unsigned int cells_per_extent[2] = { 16, 16 };

  if (_C_Quickpool_Init(2, cell_sizes, cells_per_extent) {
    printf("Error initializing Quick Pool memory manager.\n");
    return -1;
  }
  if ((p = malloc(10)) == NULL) {
    printf("Error during malloc.\n");
    return -2;
  }
  free(p);
  printf("Test successful!\n");
  return 0;
}
/*****************Output should be similar to:*****************
Test successful!
*******************************************************************/

相关信息