OSDN Git Service

(split) LDP: Release pages for LDP v3.39.
[linuxjm/LDP_man-pages.git] / release / man3 / malloc.3
index 450e4d3..44ed1aa 100644 (file)
 .\" Documented MALLOC_CHECK_, Wolfram Gloger (wmglo@dent.med.uni-muenchen.de)
 .\" 2007-09-15 mtk: added notes on malloc()'s use of sbrk() and mmap().
 .\"
-.\" Japanese Version Copyright (c) 1998 NAKANO Takeo all rights reserved.
-.\" Translated 1998-08-12, NAKANO Takeo <nakano@apm.seikei.ac.jp>
-.\" Modified 1998-12-18, NAKANO Takeo
-.\" Modified 2000-08-23, NAKANO Takeo
-.\" Modified 2001-05-19, Kentaro Shirakata <argrath@ub32.org>
-.\" Modified 2001-12-13, Kentaro Shirakata <argrath@ub32.org>
-.\" Modified 2005-03-15, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
-.\" Modified 2007-10-12, Akihiro MOTOKI, LDP v2.66
+.\"*******************************************************************
 .\"
-.\" WORD: OOM killer   メモリ不足解決器
+.\" This file was generated with po4a. Translate the source file.
 .\"
-.TH MALLOC 3  2009-01-13 "GNU" "Linux Programmer's Manual"
+.\"*******************************************************************
+.TH MALLOC 3 2012\-03\-20 GNU "Linux Programmer's Manual"
 .SH 名前
-calloc, malloc, free, realloc \- 動的なメモリの割り当てと解放を行う
+malloc, free, calloc, realloc \- 動的なメモリの割り当てと解放を行う
 .SH 書式
 .nf
-.B #include <stdlib.h>
+\fB#include <stdlib.h>\fP
 .sp
-.BI "void *calloc(size_t " "nmemb" ", size_t " "size" );
-.br
-.BI "void *malloc(size_t " "size" );
-.br
-.BI "void free(void " "*ptr" );
-.br
-.BI "void *realloc(void " "*ptr" ", size_t "  "size" );
+\fBvoid *malloc(size_t \fP\fIsize\fP\fB);\fP
+\fBvoid free(void \fP\fI*ptr\fP\fB);\fP
+\fBvoid *calloc(size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *realloc(void \fP\fI*ptr\fP\fB, size_t \fP\fIsize\fP\fB);\fP
 .fi
 .SH 説明
-.BR calloc ()
-は
-.I size
-バイトの要素
-.I nmemb
-個からなる配列にメモリを割り当て、
-割り当てられたメモリに対するポインタを返す。
-メモリの内容は数値ゼロ (全ビットがゼロのバイト) にセットされる。
-.I nmemb
-か
-.I size
-が 0 の場合、
-.BR calloc ()
-は NULL
-.\" glibc はこちら
-または
-.BR free ()
-に後で渡しても問題の起こらない一意なポインタ値を返す。
 .PP
-.BR malloc ()
-は
-.I size
-バイトを割り当て、
-割り当てられたメモリに対するポインタを返す。
-メモリの内容はクリアされない。
-.I size
-が 0 の場合、
-.BR malloc ()
-は NULL
-.\" glibc はこちら
-または
-.BR free ()
-に後で渡しても問題の起こらない一意なポインタ値を返す。
+.\" glibc does this:
+\fBmalloc\fP() 関数は \fIsize\fP バイトを割り当て、 割り当てられたメモリに対する
+ポインタを返す。\fIメモリの内容は初期化されない\fP。 \fIsize\fP が 0 の場合、
+\fBmalloc\fP() は NULL または \fBfree\fP() に後で渡しても問題の起こらない
+一意なポインタ値を返す。
 .PP
-.BR free ()
-はポインタ
-.I ptr
-が指すメモリ空間を解放する。このポインタは、以前に呼び出された
-.BR malloc (),
-.BR calloc (),
-.BR realloc ()
-のいずれかが返した値でなければならない。
-これ以外のポインタを指定したり、すでに
-.I free(ptr)
-が実行されていたりした場合の動作は定義されていない。
-.I ptr
-が NULL の場合には、なんの動作も行われない。
+\fBfree\fP() 関数はポインタ \fIptr\fP が指すメモリ空間を解放する。このポインタは、
+以前に呼び出された \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() のいずれかが返した値で
+なければならない。これ以外のポインタを指定したり、すでに \fIfree(ptr)\fP が実行
+されていたりした場合の動作は定義されていない。
+\fIptr\fP が NULL の場合には、何の動作も行われない。
 .PP
-.BR realloc ()
-は、ポインタ
-.I ptr
-が示すメモリブロックのサイズを変更して
-.I size
-バイトにする。
-新旧のサイズのうち、小さいほうのブロックに含まれる内容は変更されない。
-新しく割り当てられたメモリの内容は初期化されない。
-.I size
-がどの値であっても、
-.I ptr
-が NULL の場合には
-.I malloc(size)
-と等価である。
-.I size
-が 0 で
-.I ptr
-が NULL でない場合には、
-.I free(ptr)
-と等価である。
-.I ptr
-が NULL 以外の場合、
-.I ptr
-は以前に呼び出された
-.BR malloc (),
-.BR calloc (),
-.BR realloc ()
-のいずれかが返した値でなければならない。
-.I ptr
-が指す領域が移動されていた場合は
-.I free(ptr)
-が実行される。
+.\" glibc does this:
+\fBcalloc\fP() 関数は \fIsize\fP バイトの要素 \fInmemb\fP 個からなる配列にメモリを
+割り当て、割り当てられたメモリに対するポインタを返す。 メモリの内容は数値ゼロ
+(全ビットが 0 のバイト) にセットされる。 \fInmemb\fP か \fIsize\fP が 0 の場合、
+\fBcalloc\fP() は NULL または \fBfree\fP() に後で渡しても問題の起こらない一意な
+ポインタ値を返す。
+.PP
+\fBrealloc\fP() は、ポインタ \fIptr\fP が示すメモリブロックのサイズを \fIsize\fP バイト
+に変更する。領域の先頭から、新旧のサイズの小さい方の位置までの範囲の内容は
+変更されない。新しいサイズが前のサイズよりも大きい場合、追加されたメモリは
+初期化 \fIされない\fP。
+\fIptr\fP が NULL の場合には \fImalloc(size)\fP と等価である。
+\fIsize\fP が 0 で \fIptr\fP が NULL でない場合には、 \fIfree(ptr)\fP と等価である。
+\fIptr\fP が NULL 以外の場合、 \fIptr\fP は以前に呼び出された \fBmalloc\fP(), \fBcalloc\fP(),
+\fBrealloc\fP() のいずれかが返した値でなければならない。
+\fIptr\fP が指す領域が移動されていた場合は \fIfree(ptr)\fP が実行される。
 .SH 返り値
-.BR calloc ()
-と
-.BR malloc ()
-は、割り当てられたメモリへのポインタを返す。
-割り当てられたメモリは、あらゆる種類の変数に対応できるように
-アラインメントされている。
+関数 \fBcalloc\fP() と \fBmalloc\fP() は、割り当てられたメモリへのポインタを返す。
+割り当てられたメモリは、あらゆる種類の変数に対応できるようにアラインメントされる。
 エラーの場合、これらの関数は NULL を返す。
-.I size
-が 0 で呼び出した
-.BR malloc ()
-や、
-.I nmemb
-か
-.I size
-が 0 で呼び出した
-.BR calloc ()
-が成功した場合にも NULL が返される。
+\fIsize\fP が 0 で呼び出した \fBmalloc\fP() や、\fInmemb\fP か \fIsize\fP が 0 で呼び出した
+\fBcalloc\fP() が成功した場合にも NULL が返される。
 .PP
-.BR free ()
-は値を返さない。
+\fBfree\fP() 関数は値を返さない。
 .PP
-.BR realloc ()
-は新たに割り当てられたメモリへのポインタを返す。
+\fBrealloc\fP() 関数は新たに割り当てられたメモリへのポインタを返す。
 これはあらゆる種類の変数に対応できるようにアラインメントされており、
-.I ptr
-とは異なることもある。
-割り当て要求に失敗した場合は NULL が返る。
-.I size
-が 0 の場合には、NULL もしくは
-.BR free ()
-に渡すことができるポインタが返る。
-.BR realloc ()
-が失敗した場合には、元のブロックは変更されない。
+\fIptr\fP とは異なることもある。割り当て要求に失敗した場合は NULL が返る。
+\fIsize\fP が 0 の場合には、NULL もしくは \fBfree\fP() に渡すことができるポインタが返る。
+\fBrealloc\fP() が失敗した場合には、元のブロックは変更されない。
 つまり、解放されたり移動されたりはしない。
 .SH 準拠
 C89, C99.
 .SH 注意
-通常、
-.BR malloc ()
-は、ヒープからメモリを割り当て、必要に応じてヒープのサイズを
-.BR sbrk (2)
-を使って調節する。
-.B MMAP_THRESHOLD
-バイトよりも大きなメモリブロックを割り当てる場合、
-glibc の
-.BR malloc ()
-実装は
-.BR mmap (2)
-を使ってプライベートな無名マッピング (anonymous mapping) として
-メモリを割り当てる。
-デフォルトでは
-.B MMAP_THRESHOLD
-は 128 kB だが、
-.BR mallopt (3)
-を使って調整できる。
-.\" FIXME . there is no mallopt(3) man page yet.
-.BR mmap (2)
-を使って行われたメモリ割り当ては
-.B RLIMIT_DATA
-リソース上限の影響を受けない
-.RB ( getrlimit (2)
-参照)。
+デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、
+\fBmalloc\fP() が NULL でない値を返しても、そのメモリが実際に利用可能であること
+が保証されない。システムがメモリ不足状態になったとき、メモリ不足解決器 (OOM
+killer) によって一つまたは複数のプロセスが削除される。
+詳しい情報は、\fBproc\fP(5) の \fI/proc/sys/vm/overcommit_memory\fP と
+\fIproc/sys/vm/oom_adj\fP、およびカーネルのソースファイルの
+\fIDocumentation/vm/overcommit\-accounting\fP を参照のこと。
+
+通常、 \fBmalloc\fP()  は、ヒープからメモリを割り当て、必要に応じてヒープのサイズを \fBsbrk\fP(2)  を使って調節する。
+\fBMMAP_THRESHOLD\fP バイトよりも大きなメモリブロックを割り当てる場合、 glibc の \fBmalloc\fP()  実装は
+\fBmmap\fP(2)  を使ってプライベートな無名マッピング (anonymous mapping) として メモリを割り当てる。 デフォルトでは
+\fBMMAP_THRESHOLD\fP は 128 kB だが、 \fBmallopt\fP(3)  を使って調整できる。 \fBmmap\fP(2)
+を使って行われたメモリ割り当ては \fBRLIMIT_DATA\fP リソース上限の影響を受けない (\fBgetrlimit\fP(2)  参照)。
+
+マルチスレッドアプリケーションでのデータ破損を回避するため、内部では mutexを
+使用して、これらの関数で利用されるメモリ管理用のデータ構造を保護している。
+複数のスレッドが同時にメモリの確保や解放を行うようなマルチスレッドアプリケー
+ションでは、これらの mutex の衝突が起こり得る。マルチスレッドアプリケーション
+でのメモリ割り当て処理にスケーラビリティを持たせるために、glibc では mutex の
+衝突が検出された際には追加の \fIメモリ割り当て領域\fP を作成する。
+追加領域の各々は、(\fBbrk\fP(2) や \fBmmap\fP(2) を使って) システムにより内部的に
+割り当てられた大きな領域で、それぞれ独自の mutex により管理されている。
 
-Unix98 標準では、
-.BR malloc (),
-.BR calloc (),
-.BR realloc ()
-は実行に失敗したときに
-.I errno
-を
-.B ENOMEM
-に設定することになっている。
-Glibc ではこれが守られていることを仮定している
-(またこれらのルーチンの glibc バージョンはこのことを守っている)。
-個人的に別の malloc の実装を使っていて、その malloc が
-.I errno
-を設定しない場合には、失敗した際に
-.I errno
-にエラーの理由を設定しないライブラリルーチンがあるかもしれない。
+UNIX 98 標準では、 \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() は実行に失敗したときに \fIerrno\fP を
+\fBENOMEM\fP に設定することになっている。 Glibc ではこれが守られていることを仮定している (またこれらのルーチンの glibc
+バージョンはこのことを守っている)。 個人的に別の malloc の実装を使っていて、その malloc が\fIerrno\fP
+を設定しない場合には、失敗した際に \fIerrno\fP にエラーの理由を設定しないライブラリルーチンがあるかもしれない。
 .LP
-.BR malloc (),
-.BR calloc (),
-.BR realloc (),
-.BR free ()
-における事故は、
-ほとんどの場合はヒープの破壊 (corruption) が原因である。
-例えば、割り当てられた領域をオーバーフローする、
-同じポインタに二度 free する、などがこれにあたる。
+\fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP(), \fBfree\fP()  における事故は、 ほとんどの場合はヒープの破壊
+(corruption) が原因である。 例えば、割り当てられた領域をオーバーフローする、 同じポインタに二度 free する、などがこれにあたる。
 .PP
-最近のバージョンの Linux libc (5.4.23 以降) と glibc (2.x) では、
-.BR malloc ()
-の動作を環境変数によって制御できるような実装がされている。
-.B MALLOC_CHECK_
-が設定されていると、特殊な実装が用いられ、
-単純なエラーには耐えることができるようになる (効率は悪くなる)。例えば、
-.BR free ()
-を同じ引き数で二度呼び出してしまう、
-1 バイトだけ行きすぎてしまう (off-by-one バグ) などがこれに当たる。
-しかし、これらのエラーの全てを防ぐことができるわけではなく、
-その場合にはメモリリークが起こってしまう。
-.B MALLOC_CHECK_
-が 0 にセットされていると、ヒープの破壊を黙って無視する。
-1 にセットされていると、診断メッセージが標準エラー出力に表示される。
-2 にセットされていると、ただちに
-.BR abort (3)
-が呼び出される。
-3 にセットされていると、診断メッセージが標準エラー出力に表示され、
-プログラムは強制終了 (abort) される。
-.B MALLOC_CHECK_
-に 0 以外の値をセットして役に立つ状況としては、
-実際のプロセスのクラッシュがずっと後に起こり、
-本当の原因を探し出すのが非常に困難な場合などが挙げられるだろう。
-.SH バグ
-デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。
-つまり、
-.BR malloc ()
-が NULL でない値を返しても、そのメモリが実際に利用可能であることが
-保証されない。これは本当にまずいバグである。
-システムがメモリ不足状態になったとき、悪名高いメモリ不足解決器 (OOM killer)
-によって一つまたは複数のプロセスが削除される。
-突然あるプロセスが削除されるのが望ましくない状況で使用されていて、
-しかもカーネルのバージョンが十分に最近のものであれば、このメモリを
-割り当て過ぎる動作 (overcommitting behavior) を以下のコマンドで
-無効にできる。
-.in +4n
-.sp
-.nf
-.RB "#" " echo 2 > /proc/sys/vm/overcommit_memory"
-
-.fi
-.in
-カーネルの付属文書の
-.I vm/overcommit-accounting
-と
-.I sysctl/vm.txt
-も参照のこと。
+Linux libc の新しいバージョン (5.4.23 より後) と glibc (2.x) には、
+環境変数で動作を調整できる \fBmalloc\fP() 実装が含まれている。
+詳細は \fBmallopt\fP(3) を参照のこと。
 .SH 関連項目
-.BR brk (2),
-.BR posix_memalign (3)
-.\" .BR mallopt (3),
-.BR mmap (2),
-.BR alloca (3),
+.\" http://g.oswego.edu/dl/html/malloc.html
+.\" A Memory Allocator - by Doug Lea
+.\"
+.\" http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html
+.\" Linux Heap, Contention in free() - David Boreham
+.\"
+.\" http://www.citi.umich.edu/projects/linux-scalability/reports/malloc.html
+.\" malloc() Performance in a Multithreaded Linux Environment -
+.\"     Check Lever, David Boreham
+.\"
+\fBbrk\fP(2), \fBmmap\fP(2), \fBalloca\fP(3), \fBmalloc_get_state\fP(3),
+\fBmalloc_trim\fP(3), \fBmalloc_usable_size\fP(3), \fBmallopt\fP(3), \fBmtrace\fP(3),
+\fBposix_memalign\fP(3)