名 前
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) 以 外 の 手 段 で 割 り 当 て ら れ た 総 メ モ リ ー 量 (例 え ば ヒ ー プ に 割 り 当 て ら れ た メ モ リ ー ) 。 こ の 数 字 に は 使 用 中 の ブ ロ ッ ク や フ リ ー リ ス ト 上 の ブ ロ ッ ク も 含 ま れ る 。
通 常 の
(つ ま り fastbin で は
な い ) 未 使 用 ブ
ロ ッ ク 数 。 fastbin 未 使 用 ブ ロ ッ ク 数 (mallopt(3) 参 照 )。 hblks mmap(2) を 使 っ て 現 在 割 り 当 て ら れ て い る ブ ロ ッ ク 数 (mallopt(3) の M_MMAP_THRESHOLD の 議 論 を 参 照 )。 hblkhd mmap(2) を 使 っ て 現 在 割 り 当 て ら れ て い る ブ ロ ッ ク の バ イ ト 数 。
割 り 当
て た 空 間 の 最
高 点 ("highwater mark")、
つ ま り 、 こ れ
ま で の 中 で の
最 大 の 割 り 当
て 量 。 こ の フ
ィ ー ル ド は ス
レ ッ ド 化 さ れ
て い な い 環 境
で の み 収 集 さ
れ る 。 fastbin フ リ ー ブ ロ ッ ク の 総 バ イ ト 数 。 uordblks 使 用 中 の 割 り 当 て メ モ リ ー で 使 わ れ て い る バ イ ト 数 。
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 ==============
After allocating blocks ============== ==============
After freeing blocks ============== #include <malloc.h> static void
mi = mallinfo(); printf("Total
non−mmapped bytes (arena): %d\n", mi.arena); int if (argc < 3
|| strcmp(argv[1], "−−help") == 0)
numBlocks =
atoi(argv[1]); printf("==============
Before allocating blocks ==============\n"); for (j = 0; j
< numBlocks; j++) { alloc[j] =
malloc(blockSize); printf("\n==============
After allocating blocks ==============\n"); for (j =
freeBegin; j < freeEnd; j += freeStep) printf("\n==============
After freeing blocks ==============\n"); 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/ に 書 か れ て い る 。 |