第36章 未整理ビン / スモールビン / ラージビン

 bins[] 配列は Unsorted / Small / Large の 3 つのビンに保管されるんですが、これはインデックスがあらかじめ定義されています。

1436 /*
1437    Indexing
1438
1439     Bins for sizes < 512 bytes contain chunks of all the same size, spaced
1440     8 bytes apart. Larger bins are approximately logarithmically spaced:
1441
1442     64 bins of size       8
1443     32 bins of size      64
1444     16 bins of size     512
1445      8 bins of size    4096
1446      4 bins of size   32768
1447      2 bins of size  262144
1448      1 bin  of size what's left
1449
1450     There is actually a little bit of slop in the numbers in bin_index
1451     for the sake of speed. This makes no difference elsewhere.
1452
1453     The bins top out around 1MB because we expect to service large
1454     requests via mmap.
1455
1456     Bin 0 does not exist.  Bin 1 is the unordered list; if that would be
1457     a valid chunk size the small bins are bumped up one.
1458  */

 1個のビンは fd と bk がありますんで bins[] 配列の 2 要素を取ると考えてください。

 例えば bins[0] と bins[1] は同じ 1 個のビンになります。

8 バイト 64 ビン
スモールビン(Small bin)
64 バイト 32 ビン
ラージビン(Large bin)
512 バイト 16 ビン
ラージビン(Large bin)
4096 バイト 8 ビン
ラージビン(Large bin)

 ビンのインデックスは以下のように使われます。

Bin 1
Unsorted bin は Small / Large Bin のチャンクのいずれも保持します。
Bin 2 - Bin 63
Small bin は 512 バイト( 32 ビットアーキテクチャ)より小さいサイズのチャンクを保持します。
Bin 64 - Bin 126
Large bin は Small bin よりも大きなサイズのチャンクを保持します。

 このようにbins[] 配列のインデックスから、どの種類のビンに入っているかを確認することができます。

Copyright 2018-2019, by Masaki Komatsu