mallocは裏で何をしているのか、自作アロケータで徹底解剖
What is malloc doing, anyway?
mallocは一見シンプルだが、内部ではbrkやsbrkによるシステムコールを最小限に抑え、チャンクヘッダやフリーリスト、分割と結合、デマンドページングを駆使している。この記事では、1000回のmallocがたった2回のbrkで済む仕組みから、sbrkベースの簡易アロケータを段階的に改良してメモリをカーネルに返却するtrimまでを、実測値とともに解説する。
sbrk(16)は空のシステムコールよりわずか35ns高いだけなのに対し、malloc(16)はsbrk(16)より22.7倍高速に動作する。
HNでの議論
56- assumed_throwaw
話は逸れますが、mallocという抽象化の複雑さとオーバーヘッドこそが、私を「スタックのみ」の言語、たとえば最近公開されたGooseのようなものに非常に興味を持たせた理由そのものです。(ほぼ)完全にそれを取り除くというアイデアには、とてもエレガントでワクワクするものがあります。現代のプログラミング言語がガベージコレクタを置き換える優れた人間工学的な仕組みを発展させてきたように、同じことがヒープ割り当てメモリを置き換えるためにもできればと願っています。
- K0IN
wasmが登場したばかりでclangサポートがあった頃にwasmに取り組み始めたとき、自分でlibcとmallocを書きました。これら低レベルの関数やトリック(たとえばフリーリスト)を学ぶのはとても良い勉強になりました。また、wasmをかなり読めるようになったのも気に入っていますし、ツール群が優れていて、単に.watを返してそれを読むだけで済むのも良いですね。
- projectileboy
この(および関連)トピックの優れた学習リソース:https://cs61.seas.harvard.edu/site/2026/
- bajard
Malloc()は遅ぉぉい。free()も使うならなおさらです。可能なら単一の配列を割り当ててそこでやりくりすることを検討してください。
- wpmaven
もっと詳細を知りたい人のために、以前見つけたとてもよく説明されたものがあります:https://sploitfun.wordpress.com/2015/02/10/understanding-gli...