Manpages

名 前

mallinfo − メ モ リ ー 割 り 当 て 情 報 を 取 得 す る

書 式

#include <malloc.h>

struct mallinfo mallinfo(void);

説 明

mallinfo() 関 数 は 、 malloc(3) や 一 連 の 関 数 に よ り 実 行 さ れ た メ モ リ ー 割 り 当 て に 関 す る 情 報 を 格 納 し た 構 造 体 の コ ピ ー を 返 す 。 こ の 構 造 体 は 以 下 の よ う に 定 義 さ れ て い る 。

struct mallinfo {
int arena; /* Non−mmapped space allocated (bytes) */
int ordblks; /* Number of free chunks */
int smblks; /* Number of free fastbin blocks */
int hblks; /* Number of mmapped regions */
int hblkhd; /* Space allocated in mmapped regions (bytes) */
int usmblks; /* Maximum total allocated space (bytes) */
int fsmblks; /* Space in freed fastbin blocks (bytes) */
int uordblks; /* Total allocated space (bytes) */
int fordblks; /* Total free space (bytes) */
int keepcost; /* Top−most, releasable space (bytes) */ };

mallinfo 構 造 体 の 各 フ ィ ー ル ド に は 以 下 の 情 報 が 格 納 さ れ る 。

arena

mmap(2) 以 外 の 手 段 で 割 り 当 て ら れ た 総 メ モ リ ー 量 (例 え ば ヒ ー プ に 割 り 当 て ら れ た メ モ リ ー ) 。 こ の 数 字 に は 使 用 中 の ブ ロ ッ ク や フ リ ー リ ス ト 上 の ブ ロ ッ ク も 含 ま れ る 。

ordblks

通 常 の (つ ま り fastbin で は な い ) 未 使 用 ブ ロ ッ ク 数 。
smblks

fastbin 未 使 用 ブ ロ ッ ク 数 (mallopt(3) 参 照 )。

hblks

mmap(2) を 使 っ て 現 在 割 り 当 て ら れ て い る ブ ロ ッ ク 数 (mallopt(3) の M_MMAP_THRESHOLD の 議 論 を 参 照 )。

hblkhd

mmap(2) を 使 っ て 現 在 割 り 当 て ら れ て い る ブ ロ ッ ク の バ イ ト 数 。

usmblks

割 り 当 て た 空 間 の 最 高 点 ("highwater mark")、 つ ま り 、 こ れ ま で の 中 で の 最 大 の 割 り 当 て 量 。 こ の フ ィ ー ル ド は ス レ ッ ド 化 さ れ て い な い 環 境 で の み 収 集 さ れ る 。
fsmblks

fastbin フ リ ー ブ ロ ッ ク の 総 バ イ ト 数 。

uordblks

使 用 中 の 割 り 当 て メ モ リ ー で 使 わ れ て い る バ イ ト 数 。

fordblks フ リ ー ブ ロ ッ ク の 総 バ イ ト 数 。

keepcost ヒ ー プ の 一 番 上 に あ る 解 放 可 能 な 未 使 用 の 空 間 の 大 き さ 。 こ の 値 は

malloc_trim(3) で 理 想 的 な 場 合 に 解 放 で き る 最 大 の バ イ ト 数 で あ る (理 想 的 と い う の は 、 ペ ー ジ 境 界 の 制 限 な ど を 無 視 し た 場 合 で あ る 。

準 拠

こ の 関 数 は POSIX や C 標 準 で は 規 定 さ れ て い な い 。 多 く の System V 由 来 の シ ス テ ム に 同 様 の 関 数 が 存 在 し 、 SVID で は 同 様 の 関 数 が 規 定 さ れ て い た 。

バ グ

こ れ ら の 情 報 は メ イ ン の メ モ リ ー 割 り 当 て 領 域 に 対 す る も の の み で あ る 。 他 の 領 域 の 割 り 当 て は 対 象 に な ら な い 。 他 の 領 域 の 情 報 も 取 得 で き る 別 の 手 段 に つ い て は malloc_stats(3)malloc_info(3) を 参 照 。

mallinfo 構 造 体 の 各 フ ィ ー ル ド は int 型 で あ る 。 し か し 、 い く つ か の 内 部 管 理 用 の 値 は long 型 の 場 合 も あ る の で 、 報 告 さ れ る 値 が 一 周 し て し ま い 、 不 正 確 に な る 可 能 性 が あ る 。

以 下 の プ ロ グ ラ ム は mallinfo() を 利 用 し て 、 メ モ リ ー ブ ロ ッ ク の 割 り 当 て 、 解 放 の そ れ ぞ れ 前 後 で メ モ リ ー 割 り 当 て の 統 計 情 報 を 取 得 す る 。 統 計 情 報 は 標 準 出 力 に 表 示 さ れ る 。 最 初 の 2 つ の コ マ ン ド ラ イ ン 引 き 数 は malloc(3) で 割 り 当 て る ブ ロ ッ ク 数 と サ イ ズ を 指 定 す る 。 残 り の 3 つ の 引 き 数 は 、 ど の 割 り 当 て ら れ た ブ ロ ッ ク を free(3) で 解 放 す べ き か を 指 定 す る 。 こ れ ら の 3 つ の 引 き 数 の 指 定 は 任 意 で 、 最 初 の も の か ら 順 に 以 下 の 情 報 を 指 定 す る 。 1 つ 目 の 引 き 数 は 、 ブ ロ ッ ク を 解 放 す る ル ー プ で 使 用 す る ス テ ッ プ サ イ ズ を 指 定 す る (デ フ ォ ル ト 値 は 1 で 、 1 は 指 定 し た 範 囲 の す べ て の ブ ロ ッ ク を 解 放 す る こ と を 意 味 す る )。 2 つ 目 の 引 き 数 は 、 解 放 す る 先 頭 ブ ロ ッ ク の 場 所 番 号 を 指 定 す る (デ フ ォ ル ト 値 は 0 で 、 0 は 先 頭 の 割 り 当 て 済 み ブ ロ ッ ク を 意 味 す る )。 3 つ 目 の 引 き 数 は 、 解 放 す る 最 終 ブ ロ ッ ク の 場 所 番 号 よ り ひ と つ 大 き い 値 を 指 定 す る (デ フ ォ ル ト 値 は 最 大 ブ ロ ッ ク 番 号 よ り も ひ と つ 大 き い 値 で あ る )。 こ れ ら の 3 つ の 引 き 数 が 省 略 さ れ た 場 合 、 デ フ ォ ル ト で は す べ て の 割 り 当 て ら れ た ブ ロ ッ ク が 解 放 さ れ る 。 以 下 の プ ロ グ ラ ム の 実 行 例 で は 、 100 バ イ ト の 割 り 当 て を 1000 回 実 行 し 、 割 り 当 て た ブ ロ ッ ク の 2 つ に 1 つ を 解 放 す る 。

$ ./a.out 1000 100 2
============== Before allocating blocks ==============
Total non−mmapped bytes (arena): 0
# of free chunks (ordblks): 1
# of free fastbin blocks (smblks): 0
# of mapped regions (hblks): 0
Bytes in mapped regions (hblkhd): 0
Max. total allocated space (usmblks): 0
Free bytes held in fastbins (fsmblks): 0
Total allocated space (uordblks): 0
Total free space (fordblks): 0
Topmost releasable block (keepcost): 0

============== After allocating blocks ==============
Total non−mmapped bytes (arena): 135168
# of free chunks (ordblks): 1
# of free fastbin blocks (smblks): 0
# of mapped regions (hblks): 0
Bytes in mapped regions (hblkhd): 0
Max. total allocated space (usmblks): 0
Free bytes held in fastbins (fsmblks): 0
Total allocated space (uordblks): 104000
Total free space (fordblks): 31168
Topmost releasable block (keepcost): 31168

============== After freeing blocks ==============
Total non−mmapped bytes (arena): 135168
# of free chunks (ordblks): 501
# of free fastbin blocks (smblks): 0
# of mapped regions (hblks): 0
Bytes in mapped regions (hblkhd): 0
Max. total allocated space (usmblks): 0
Free bytes held in fastbins (fsmblks): 0
Total allocated space (uordblks): 52000
Total free space (fordblks): 83168
Topmost releasable block (keepcost): 31168 プ ロ グ ラ ム の ソ ー ス

#include <malloc.h>
#include "tlpi_hdr.h"

static void
display_mallinfo(void)
{
struct mallinfo mi;

mi = mallinfo();

printf("Total non−mmapped bytes (arena): %d\n", mi.arena);
printf("# of free chunks (ordblks): %d\n", mi.ordblks);
printf("# of free fastbin blocks (smblks): %d\n", mi.smblks);
printf("# of mapped regions (hblks): %d\n", mi.hblks);
printf("Bytes in mapped regions (hblkhd): %d\n", mi.hblkhd);
printf("Max. total allocated space (usmblks): %d\n", mi.usmblks);
printf("Free bytes held in fastbins (fsmblks): %d\n", mi.fsmblks);
printf("Total allocated space (uordblks): %d\n", mi.uordblks);
printf("Total free space (fordblks): %d\n", mi.fordblks);
printf("Topmost releasable block (keepcost): %d\n", mi.keepcost); }

int
main(int argc, char *argv[])
{
#define MAX_ALLOCS 2000000
char *alloc[MAX_ALLOCS];
int numBlocks, j, freeBegin, freeEnd, freeStep;
size_t blockSize;

if (argc < 3 || strcmp(argv[1], "−−help") == 0)
usageErr("%s num−blocks block−size [free−step [start−free "
"[end−free]]]\n", argv[0]);

numBlocks = atoi(argv[1]);
blockSize = atoi(argv[2]);
freeStep = (argc > 3) ? atoi(argv[3]) : 1;
freeBegin = (argc > 4) ? atoi(argv[4]) : 0;
freeEnd = (argc > 5) ? atoi(argv[5]) : numBlocks;

printf("============== Before allocating blocks ==============\n");
display_mallinfo();

for (j = 0; j < numBlocks; j++) {
if (numBlocks >= MAX_ALLOCS)
fatal("Too many allocations");

alloc[j] = malloc(blockSize);
if (alloc[j] == NULL)
errExit("malloc"); }

printf("\n============== After allocating blocks ==============\n");
display_mallinfo();

for (j = freeBegin; j < freeEnd; j += freeStep)
free(alloc[j]);

printf("\n============== After freeing blocks ==============\n");
display_mallinfo();

exit(EXIT_SUCCESS); }

関 連 項 目

mmap(2), malloc(3), malloc_info(3), malloc_stats(3), malloc_trim(3), mallopt(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。