[解決済み] malloc()は内部でどのように実装されているのですか?重複
質問
どなたか、どのように
malloc()
が内部でどのように動作しているか説明できますか?
私は時々
strace program
をよく見かけますが
sbrk
システムコールを行い
man sbrk
で使用されることについて話す。
malloc()
で使われていることを述べていますが、それ以上ではありません。
どのように解決するのですか?
この
sbrk
システムコールはデータセグメントの境界を移動します。これは、プログラムがデータを読み書きできる領域の境界を移動させることを意味します (データを拡大または縮小させますが、AFAIK では
malloc
は本当にその方法でカーネルにメモリセグメントを返しません)。それとは別に
mmap
これはファイルをメモリにマップするために使われますが、メモリを割り当てるためにも使われます(共有メモリを割り当てる必要がある場合。
mmap
はそれを行う方法です)。
つまり、カーネルからより多くのメモリを得るための方法が2つあるわけです。
sbrk
と
mmap
. カーネルから得たメモリをどのように整理するかについては、様々な戦略があります。
1つの素朴な方法は、しばしば "bucket" と呼ばれる、特定の構造サイズ専用のゾーンに分割することです。例えば
malloc
の実装では、16、64、256、1024 バイトの構造体用のバケットを作成することができます。もしあなたが
malloc
にあるサイズのメモリを要求すると、その数は次のバケットサイズに切り上げられ、そのバケットから要素を取得します。より大きな領域が必要な場合は
malloc
を使うことができます。
mmap
を使って、カーネルと直接アロケートすることができます。もし、あるサイズのバケットが空であれば
malloc
を使うことができます。
sbrk
を使って、新しいバケツのためのより多くのスペースを得ることができます。
そこには様々な
malloc
を実装する真の方法はないでしょう。
malloc
を実装する方法は、速度、オーバーヘッド、断片化/空間的効果の回避の間で妥協する必要があるからです。たとえば、バケツの要素がなくなった場合、ある実装はより大きなバケツから要素を取得し、それを分割して要素がなくなったバケツに追加するかもしれません。これは非常にスペース効率が良いのですが、すべての設計で可能なわけではありません。もし、別のバケツを
sbrk
/
mmap
というように、より速く、より簡単かもしれませんが、スペース効率は良くありません。また、デザインはもちろん、"free" が次のようなスペースを利用できるようにする必要があることも考慮しなければなりません。
malloc
に再び使用できるようにする必要があります。メモリを再利用せずにただ配ることはできません。
もし興味があるなら、OpenSER/KamailioのSIPプロキシは、2つの
malloc
の実装があります (これらは共有メモリを多用するため、独自のものが必要であり、 システムの
malloc
は共有メモリをサポートしないため、独自の実装が必要です)。参照してください。
https://github.com/OpenSIPS/opensips/tree/master/mem
それから、あなたはまた
GNU libc
malloc
の実装を見ることができます。
がありますが、これは非常に複雑です。
関連
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み】malloc()とfree()はどのように動作するのですか?