パート IV. glibc から malloc() の基本構造を理解してみる

目次

28. malloc() の内部実装
29. アリーナによるマルチスレッド対応
30. アリーナオブジェクト( main_arena / malloc_state )
31. ヒープのヘッダーオブジェクト( heap_info )
32. チャンク( malloc_chunk )
33. 最少チャンクサイズと最少割り当てサイズ
34. malloc_par
35. top チャンク
35.1. ビン
36. 未整理ビン / スモールビン / ラージビン
37. ビンのインデックスの計算
37.1. 32 ビットアーキテクチャのビン
37.2. 64 ビットアーキテクチャのビン
38. ビン・インデックスのまとめ
39. ビンのチャンク連結
40. ビンの初期化
41. 未整理チャンク( Unsorted Chunk )のマクロ
42. トップチャンク( Top Chunk )のマクロ
43. Binmap のマクロ
44. tcache
45. malloc() フリーチャンクの挙動
46. malloc.c の内部マクロ
46.1. チャンクを取り扱えるマクロ
47. ファーストビンの解放
48. malloc.c の内部関数
49. malloc() の実装
49.1. _int_malloc() 関数
50. free() の実装
51. calloc()
52. realloc()
53. alloca() 関数
53.1. alloca() の使用法
54. posix_memalign() / aligned_alloc()
54.1. glibc-2.7 の内部実装
54.2. アラインメントの仕組み
54.3. アラインメントの最少サイズ
54.4. 大きめのアラインメント
54.5. 複数のアラインメントでの検証
55. std::launder ( C++17 )
56. std::aligned_storage ( C++11 )
57. std::align ( C++11 )
58. std::aligned_alloc ( C++17 )

 glibc は GNU-C のライブラリーです。

 C++ のコンパイラなんかもこれを使っています。

 malloc() 関数の実装も glibc に含まれます。

 ということでメモリー管理を掘り下げたいなら glibc を少し学んでおく必要があります。

 とは言っても glibc 全部の説明なんて、とてもじゃないけどできません。

 それで詳細のチェックは読者におまかせしますが、まずはソースコードを読める環境だけは整えようじゃありませんか。

 まずは現在使われている glibc のバージョンをチェックです。

$ ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
作者 Roland McGrath および Ulrich Drepper。

 それと glibc のライブラリーはコマンド(実行可能ファイル)として使うと、バージョンがチェックできます。

$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1) stable release version 2.27.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.3.0.
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

 その他にもバージョンの調べ方は色々あるので読者におまかせしますね。

 最後に glibc を github からダウンロードする必要があるんですが、これは読者が自分で調べることを進めますが、一応以下のように bminor さんという方がリポジトリーを作っているのでクローンできるようになっています。

$ git clone -b release/2.27/master https://github.com/MacKomatsu/glibc.git

 https://github.com/MacKomatsu/glibc.git リポジトリーは bminor の glibc というリポジトリーを2018年にフォークしたものです。

 コマンドの方は「release/2.27/master」というブランチを指定してクローンしています。

 筆者も glibc に詳しい「ニキ」(アニキ、アネキの短縮形として 2ch で誕生した言葉らしい)ではないので glibc-2.27 のリリース版と勝手に理解しています。

 まあ、ブランチが多すぎて、何がリリースなのか分からないといきはリリースと名前のついたものを見つけておけば、大体は古いバージョンのリリース版なので、間違ってはないと思います。

Copyright 2018-2019, by Masaki Komatsu