_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 個位元組大小的資料格。 當提出儲存體要求時,記憶體管理程式會先將要求指派給儲存區。 記憶體管理程式會比較要求中的儲存體大小與給定儲存區中的 Cell 大小。

在此範例中,第一個儲存區滿足大小為 1 到 16 個位元組的要求; 第二個儲存區滿足大小為 17 到 256 個位元組的要求; 第三個儲存區滿足大小為 257 到 1024 個位元組的要求,第四個儲存區滿足大小為 1025 到 2048 個位元組的要求。 任何大於最大資料格大小的要求,都會透過預設記憶體管理程式來配置。

指派儲存區之後,會檢查儲存區的可用佇列。 每一個儲存區都有一個可用佇列,其中包含已釋放且尚未重新配置的資料格。 如果可用佇列上有 Cell ,則會從可用佇列中移除該 Cell 並傳回; 否則,會從儲存區的現行延伸範圍中擷取該 Cell。 延伸範圍是配置成一個區塊的資料格集合。 一開始,儲存區沒有延伸範圍。

當第一個要求進入儲存區時,會配置儲存區的延伸範圍,並從該延伸範圍滿足要求。 該延伸範圍也會滿足儲存區稍後的要求,直到延伸範圍耗盡為止。 當延伸範圍耗盡時,會為儲存區配置新的延伸範圍。 如果無法配置新的延伸範圍,則會假設記憶體問題存在。 將嘗試使用預設記憶體管理程式來配置儲存體。 如果嘗試失敗,則會傳回空值。

numpools
用於「快速儲存區」記憶體管理程式的儲存區數目。 此參數可以具有介於 1 與 64 之間的值。
儲存格大小
不帶正負號的整數值陣列。 陣列中的項目數等於 numpools 參數上指定的數目。 每一個項目指定給定儲存區之資料格中的位元組數。 這些值必須是 16 位元組的倍數。 如果指定的值不是 16 位元組的倍數,則資料格大小會四捨五入至 16 位元組的下一個較大倍數。 最小有效值為 16 個位元組,最大有效值為 4096 個位元組。
num_cell
不帶正負號的整數值陣列。 陣列中的項目數等於 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() 函數的回覆值:
0
成功
-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!
*******************************************************************/

相關資訊