标签:组成 分享 ext 打印 int 技术分享 固定 order void
jemalloc中按存储单元的块大小分,有region、run、chunk三种存储块。
最小的单元是region,它的大小是8字节~14KB,1个或多个相同大小的region组成一个run。
run的大小必须是页(4kB)的整数倍,相同大小region对应的run的大小总是相同的,多个run组成一个chunk。
chunk的大小固定是2M(或4M,可配置)。
| region size | run size | number of region in run |
| 8 | 4K | 512 |
| 16 | 4k | 256 |
| 32 | 4k | 128 |
| 48 | 12k | 256 |
| 64 | 4k | 64 |
| 80 | 20k | 256 |
| 96 | 12k | 128 |
| 112 | 28k | 256 |
| 128 | 4k | 32 |
| 160 | 20k | 128 |
| 192 | 12k | 64 |
| 224 | 28k | 128 |
| 256 | 4k | 16 |
| 320 | 20k | 64 |
| 384 | 12k | 32 |
| 448 | 28k | 64 |
| 512 | 4k | 8 |
| 640 | 20k | 32 |
| 768 | 12k | 16 |
| 896 | 28k | 32 |
| 1024 | 4k | 4 |
| 1280 | 20k | 16 |
| 1536 | 12k | 8 |
| 1792 | 28k | 16 |
| 2048 | 4k | 2 |
| 2560 | 20k | 8 |
| 3072 | 12k | 4 |
| 3584 | 20k | 8 |
| 4096 | 4k | 1 |
| 5120 | 20k | 4 |
| 6144 | 12k | 2 |
| 7168 | 28k | 4 |
| 8192 | 8k | 1 |
| 10240 | 20k | 2 |
| 12288 | 12k | 1 |
| 14336 | 28k | 2 |
相关代码:
arena_bin_info_t arena_bin_info[NBINS]; static void bin_info_init(void) { arena_bin_info_t *bin_info; #define BIN_INFO_INIT_bin_yes(index, size) \ bin_info = &arena_bin_info[index]; bin_info->reg_size = size; bin_info_run_size_calc(bin_info); bitmap_info_init(&bin_info->bitmap_info, bin_info->nregs); #define BIN_INFO_INIT_bin_no(index, size) #define SC(index, lg_grp, lg_delta, ndelta, bin, lg_delta_lookup) \ BIN_INFO_INIT_bin_##bin(index, (ZU(1)<<lg_grp) + (ZU(ndelta)<<lg_delta)) SIZE_CLASSES #undef BIN_INFO_INIT_bin_yes #undef BIN_INFO_INIT_bin_no #undef SC }
gdb中打印arena_bin_info:
(gdb) p je_arena_bin_info
$353 = {{
reg_size = 8,
redzone_size = 0,
reg_interval = 8,
run_size = 4096,
nregs = 512,
bitmap_info = {
nbits = 512,
ngroups = 8
},
reg0_offset = 0
}, {
reg_size = 16,
redzone_size = 0,
reg_interval = 16,
run_size = 4096,
nregs = 256,
bitmap_info = {
nbits = 256,
ngroups = 4
},
reg0_offset = 0
}, {
reg_size = 32,
redzone_size = 0,
reg_interval = 32,
run_size = 4096,
nregs = 128,
bitmap_info = {
nbits = 128,
ngroups = 2
},
reg0_offset = 0
}, {
...
}, {
reg_size = 12288,
redzone_size = 0,
reg_interval = 12288,
run_size = 12288,
nregs = 1,
bitmap_info = {
nbits = 1,
ngroups = 1
},
reg0_offset = 0
}, {
reg_size = 14336,
redzone_size = 0,
reg_interval = 14336,
run_size = 28672,
nregs = 2,
bitmap_info = {
nbits = 2,
ngroups = 1
},
reg0_offset = 0
}}
region、run、chunk之间的位置关系如下:

标签:组成 分享 ext 打印 int 技术分享 固定 order void
原文地址:http://www.cnblogs.com/YYPapa/p/6913768.html