総合手引 | セクション 9 | English | オプション |
#include <sys/types.h>
#include <sys/malloc.h>
#include <sys/param.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
free() 関数は malloc() で先に割り当てられていた addr のアドレスのメモリを再使用するために解放します。 メモリは 0 にクリアされません。 addr が NULL の場合、 free() は何もしません。
realloc() 関数は、以前に割り当てられて addr で参照されるメモリの大きさを size バイトに変更します。 メモリの内容は、新サイズと旧サイズの小さい方までは、無変更となります。 戻り値は addr と違うかもしれないことに注意してください。 要求されたメモリが割り当て不能の場合、 NULL が返され、 addr で参照されるメモリは正当で無変更のままとなります。 addr が NULL の場合、 realloc() 関数は指定された大きさの malloc() と同等に振舞います。
reallocf() 関数は realloc() とまったく同じですが、 要求されたメモリを割り当て不能の場合に 渡されたポインタのメモリを解放する点が違います。
マクロ版の MALLOC() は機能的には
(space) = (cast)malloc((u_long)(size), type, flags)
と同等で、 マクロ版 FREE() は
free((addr), type)
と同等です。 標準Cライブラリの同義関数 (malloc(3)) とは異なり、カーネルバージョンは更に 2 つの引数をとります。 引数 flags は malloc() の操作上の特性を以下のようにみなします。
M_ZERO | |
割り当てられたメモリが全て 0 で満たされるようにします。 | |
M_NOWAIT | |
リソースの不足のため直ちに要求を満たすことができない場合は、 malloc(), realloc(), および reallocf() が NULL を返すようにします。 割り込みコンテキストでの動作時には M_NOWAIT が要求されることに注意してください。 | |
M_WAITOK | |
はリソースを待つことが OK であることを示します。 この要求がすぐに満たされることが出来ない場合には、現在のプロセスは、 他のプロセスによってリソースが開放されることを待つために、 スリープ状態に置かれます。 M_WAITOK が指定されると malloc(), realloc(), reallocf() 関数は NULL を返すことが出来ません。 | |
M_USE_RESERVE | |
要求されたメモリを獲得するために、 システムがリザーブ領域を使ってよいことを示します。 このオプションは以前は M_KERNEL と呼ばれていましたが、 より明示的に改名されました。 このオプションは軽視されていて、カーネルから徐々に削除されています。 そのため、新たなプログラミングでは使用されない様にするべきです。 | |
厳密に M_WAITOK または M_NOWAIT のどちらかが指定されなければなりません。
引数 type はメモリの利用方法の統計をとるためと、 簡単なサニティチェックのために使われています。 これは複数の割り当てを識別するために使用することが可能です。 この統計は 'vmstat -m' で調べることが出来ます。
type は MALLOC_DECLARE() と MALLOC_DEFINE() マクロを通じて struct malloc_type typedef を使用して定義されます。
/* sys/something/foo_extern.h */MALLOC_DECLARE(M_FOOBUF);
/* sys/something/foo_main.c */
MALLOC_DEFINE(M_FOOBUF, "foobuffers", "Buffers to foo data into the ether");
/* sys/something/foo_subr.c */
amp;...
MALLOC(buf, struct foo_buf *, sizeof *buf, M_FOOBUF, M_NOWAIT);
MALLOC_DEFINE() を使用するためには、 <sys/param.h> <(> の代わりに) および <sys/kernel.h> をインクルードしなければなりません。
プログラマは malloc フラグの M_NOWAIT および M_WAITOK と、 mbuf(9) [英語] フラグの M_DONTWAIT および M_TRYWAIT を混乱しないように注意するべきです。
Giant ではない mutex が保持されている間は、 malloc(), realloc() および reallocf() は M_WAITOK 付きで呼び出したときにはスリープするかもしれません。 free() は決してスリープしません。
vnode(9) インタロックを保持している時の malloc() ( M_NOWAIT 付であっても) または free() への全ての呼出しは、VM オブジェクトと vnode の相互のからみ合いのために、 LOR (ロック順序の逆転) を引き起こします。
MALLOC (9) | June 12, 2003 |
総合手引 | セクション 9 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | As soon as we started programming, we found to our surprise that it wasn't as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs. | ” |
— Maurice Wilkes |