Manpages

名 前

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/ に 書 か れ て い る 。