第28章 malloc() の内部実装

 malloc() はシングルスレッドだと単に brk() / sbrk() システムコールを実装したものと考えれば良いのですが、マルチスレッドにすると一気に複雑になります。

 それで malloc() の実装は大昔には dlmalloc() というのを使ってたらしいですが、最近は ptmalloc() というのが標準みたいです。

 dlmalloc() / ptmalloc() もいずれも十分に複雑なんですが、dlmalloc() はスレッドを考えない分かなりシンプルな方に分類できますかね。

 それでこの項目では malloc() という時は ptmalloc() のことを言います。

 もちろん malloc() の中身を全て理解している人なんて、一部の猛者を除いて滅多にお目にかかれませんし、ptmalloc() となると尚更難しくなります。

 なので筆者が説明できる範囲も、筆者の理解が及び部分だけになります。

 まあ大したことないっすよ…

 (´・ω・`)

 それと malloc にはいくつか基本使用みたいなものがあります。

サポートするポインターサイズ
4 バイトまたは 8 バイト
サポートする size_t
4 バイトまたは 8 バイト
アラインメント
2 * sizeof(size_t)
各割り当てチャンクに発生するオーバヘッド
4 バイトまたは 8 バイト

 それと 8 バイトのポインターの割り当てサイズは最低でも 24/32 バイトになります。

 最大だと 2^64 - 2 ページ(筆者の検証環境では 1 ページは4096)となります。

 詳細は malloc.c に記述されていますので、チェックしておいてくださいね。

malloc.c(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/malloc/malloc.c). 

  93   Supported pointer representation:       4 or 8 bytes
  94   Supported size_t  representation:       4 or 8 bytes
  95        Note that size_t is allowed to be 4 bytes even if pointers are 8.
  96        You can adjust this by defining INTERNAL_SIZE_T
  97
  98   Alignment:                              2 * sizeof(size_t) (default)
  99        (i.e., 8 byte alignment with 4byte size_t). This suffices for
 100        nearly all current machines and C compilers. However, you can
 101        define MALLOC_ALIGNMENT to be wider than this if necessary.
 102
 103   Minimum overhead per allocated chunk:   4 or 8 bytes
 104        Each malloced chunk has a hidden word of overhead holding size
 105        and status information.
 106
 107   Minimum allocated size: 4-byte ptrs:  16 bytes    (including 4 overhead)
 108         8-byte ptrs:  24/32 bytes (including, 4/8 overhead)
//略
 126   Maximum allocated size:  4-byte size_t: 2^32 minus about two pages
 127          8-byte size_t: 2^64 minus about two pages
//略
 146   Thread-safety: thread-safe

 アラインメント(Alignment)は 2 * sizeof(size_t) がデフォルト値になります。

 この値は MALLOC_ALIGNMENT の目安となります。

 筆者のうろ覚えだと 32 ビットアーキテクチャなら 8 バイト、64 ビットアーキテクチャなら 16 バイトになるでしょう。

 ああそれと malloc() はスレッドセーフなので、マルチスレッドで使っても特に何もしなくても大丈夫だともコメントには書いていますね。

Copyright 2018-2019, by Masaki Komatsu