名 前
malloc_info − malloc の 状 態 を ス ト リ ー ム に 出 力 す る
書 式
#include <malloc.h>
int malloc_info(int options, FILE *stream);
説 明
malloc_info() 関 数 は 、 呼 び 出 し 元 の メ モ リ ー 割 り 当 て 実 装 の 現 在 の 状 態 を 表 す XML 文 字 列 を 出 力 す る 。 文 字 列 は 、 フ ァ イ ル ス ト リ ー ム stream に 出 力 さ れ る 。 出 力 さ れ た 文 字 列 に は 、 全 て の 割 り 当 て 領 域 の 情 報 が 含 ま れ る (malloc(3) 参 照 )。 現 在 の 実 装 で は 、 options は 0 で な け れ ば な ら な い 。
返 り 値
malloc_info() は 、 成 功 す る と 0 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー の 原 因 を 示 す 値 を 設 定 す る 。
エ ラ ー
EINVAL |
options が 0 で な か っ た 。 |
バ ー ジ ョ ン
malloc_info() は glibc バ ー ジ ョ ン 2.10 で 追 加 さ れ た 。
準 拠
こ の 関 数 は GNU に よ る 拡 張 で あ る 。
注 意
メ モ リ ー 割 り 当 て 情 報 は (C の 構 造 体 で は な く ) XML 文 字 列 と し て 提 供 さ れ る 。 こ れ は 、 こ の 情 報 は 時 間 を た つ と (内 部 で 使 用 し て い る 実 装 に よ っ て ) 変 わ る 可 能 性 が あ る か ら で あ る 。 出 力 さ れ る XML 文 字 列 に は バ ー ジ ョ ン フ ィ ー ル ド が 付 い て い る 。
open_memstream(3) 関 数 を 使 う と 、 malloc_info() の 出 力 を 、 フ ァ イ ル で は な く メ モ リ ー 内 の バ ッ フ ァ ー に 直 接 送 る こ と が で き る 。
malloc_info() 関 数 は 、 malloc_stats(3) と mallinfo(3) の 不 備 を 解 決 す る た め に 設 定 さ れ た 。
例
以 下 の プ ロ グ ラ ム は 最 大 で 4 つ の コ マ ン ド ラ イ ン 引 数 を 取 り 、 最 初 の 3 つ は 必 須 で あ る 。 最 初 の 引 数 は 、 こ の プ ロ グ ラ ム が 生 成 す る ス レ ッ ド 数 を 指 定 す る 。 メ イ ン ス レ ッ ド を 含 む 全 て の ス レ ッ ド が 第 2 引 数 で 指 定 し た 数 の メ モ リ ー ブ ロ ッ ク の 割 り 当 て を 行 う 。 第 3 引 数 は 割 り 当 て る ブ ロ ッ ク の サ イ ズ を 制 御 す る 。 メ イ ン ス レ ッ ド は こ の サ イ ズ の ブ ロ ッ ク を 作 成 し 、 こ の プ ロ グ ラ ム が 生 成 す る 2 番 目 の ス レ ッ ド は こ の サ イ ズ の 2 倍 の サ イ ズ の ブ ロ ッ ク を 、 3 番 目 の ス レ ッ ド は こ の サ イ ズ の 3 倍 の サ イ ズ の ブ ロ ッ ク を 割 り 当 て 、 以 下 同 様 で あ る 。 こ の プ ロ グ ラ ム は malloc_info() を 2 回 呼 び 出 し 、 メ モ リ ー 割 り 当 て 状 態 を 表 示 す る 。 最 初 の 呼 び 出 し は ス レ ッ ド の 生 成 も メ モ リ ー の 割 り 当 て も 行 わ れ る 前 に 実 行 さ れ る 。 2 回 目 の 呼 び 出 し は 全 て の ス レ ッ ド が メ モ リ ー 割 り 当 て を 行 っ た 後 に 実 行 さ れ る 。 以 下 の 例 で は 、 コ マ ン ド ラ イ ン 引 数 で 、 追 加 で ス レ ッ ド を 一 つ 生 成 し 、 メ イ ン ス レ ッ ド と 追 加 の ス レ ッ ド の 両 方 が 10000 個 の メ モ リ ー ブ ロ ッ ク を 割 り 当 て る よ う に 指 定 し て い る 。 メ モ リ ー ブ ロ ッ ク の 割 り 当 て 後 の malloc_info() で は 、 2 つ の 割 り 当 て 領 域 の 状 態 が 表 示 さ れ て い る 。
$ getconf
GNU_LIBC_VERSION
glibc 2.13
$ ./a.out 1 10000 100
============ Before allocating blocks ============
<malloc version="1">
<heap nr="0">
<sizes>
</sizes>
<total type="fast" count="0"
size="0"/>
<total type="rest" count="0"
size="0"/>
<system type="current"
size="135168"/>
<system type="max" size="135168"/>
<aspace type="total"
size="135168"/>
<aspace type="mprotect"
size="135168"/>
</heap>
<total type="fast" count="0"
size="0"/>
<total type="rest" count="0"
size="0"/>
<system type="current"
size="135168"/>
<system type="max" size="135168"/>
<aspace type="total"
size="135168"/>
<aspace type="mprotect"
size="135168"/>
</malloc>
============
After allocating blocks ============
<malloc version="1">
<heap nr="0">
<sizes>
</sizes>
<total type="fast" count="0"
size="0"/>
<total type="rest" count="0"
size="0"/>
<system type="current"
size="1081344"/>
<system type="max"
size="1081344"/>
<aspace type="total"
size="1081344"/>
<aspace type="mprotect"
size="1081344"/>
</heap>
<heap nr="1">
<sizes>
</sizes>
<total type="fast" count="0"
size="0"/>
<total type="rest" count="0"
size="0"/>
<system type="current"
size="1032192"/>
<system type="max"
size="1032192"/>
<aspace type="total"
size="1032192"/>
<aspace type="mprotect"
size="1032192"/>
</heap>
<total type="fast" count="0"
size="0"/>
<total type="rest" count="0"
size="0"/>
<system type="current"
size="2113536"/>
<system type="max"
size="2113536"/>
<aspace type="total"
size="2113536"/>
<aspace type="mprotect"
size="2113536"/>
</malloc> プ ロ グ ラ
ム の ソ ー ス
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>
#include <errno.h>
static size_t
blockSize;
static int numThreads, numBlocks;
#define
errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ }
while (0)
static void *
thread_func(void *arg)
{
int j;
int tn = (int) arg;
/* The
multiplier '(2 + tn)' ensures that each thread (including
the main thread) allocates a different amount of memory
*/
for (j = 0; j
< numBlocks; j++)
if (malloc(blockSize * (2 + tn)) == NULL)
errExit("malloc−thread");
sleep(100); /*
Sleep until main thread terminates */
return NULL; }
int
main(int argc, char *argv[])
{
int j, tn, sleepTime;
pthread_t *thr;
if (argc <
4) {
fprintf(stderr,
"%s num−threads num−blocks block−size
[sleep−time]\n",
argv[0]);
exit(EXIT_FAILURE); }
numThreads =
atoi(argv[1]);
numBlocks = atoi(argv[2]);
blockSize = atoi(argv[3]);
sleepTime = (argc > 4) ? atoi(argv[4]) : 0;
thr =
calloc(numThreads, sizeof(pthread_t));
if (thr == NULL)
errExit("calloc");
printf("============
Before allocating blocks ============\n");
malloc_info(0, stdout);
/* Create threads that allocate different amounts of memory */
for (tn = 0; tn
< numThreads; tn++) {
errno = pthread_create(&thr[tn], NULL, thread_func,
(void *) tn);
if (errno != 0)
errExit("pthread_create");
/* If we add a
sleep interval after the start−up of each
thread, the threads likely won't contend for malloc
mutexes, and therefore additional arenas won't be
allocated (see malloc(3)). */
if (sleepTime
> 0)
sleep(sleepTime); }
/* The main thread also allocates some memory */
for (j = 0; j
< numBlocks; j++)
if (malloc(blockSize) == NULL)
errExit("malloc");
sleep(2); /*
Give all threads a chance to
complete allocations */
printf("\n============
After allocating blocks ============\n");
malloc_info(0, stdout);
exit(EXIT_SUCCESS); }
関 連 項 目
mallinfo(3), malloc(3), malloc_stats(3), mallopt(3), open_memstream(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。