jemalloc横向分析(三) arena_run_split_large使用分配的chunk存放tcache
来源:互联网 发布:2016淘宝助理手机版 编辑:程序博客网 时间:2024/06/06 00:53
chunk分配完成,管理每一页的mapbits和misc信息设置完成,然后就是分配一块内存放tcache相关的信息了
tcache相关信息的大小前面已经计算过,经过对齐和sa2u,大小是32768,0x8000,需要8页,但是arena_malloc_large函数分配时加上了large_pad
这个大小是1页,所以总共使用了9页,大小是0x9000,36864
这就是arena_run_split_large(arena, run, size, zero)的工作
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run); 地址对齐,得到chunk地址
miscelm = arena_run_to_miscelm(run); 通过run字段得到所在的misc的地址
run_ind = arena_miscelm_to_pageind(miscelm); 得到这个miscelm对应的页序号(13)
flag_dirty = arena_mapbits_dirty_get(chunk, run_ind); 得到这个miscelm的各种标记以及total_pages(通过页序号得到对应的mapbits)
flag_decommitted = arena_mapbits_decommitted_get(chunk, run_ind); 第13页对应第0个mapbits
arena_run_split_remove(arena, chunk, run_ind, flag_dirty, flag_decommitted, need_pages);
arena_avail_remove(arena, chunk, run_ind, total_pages); 先从arena的runs_avail树中移除run_ind对应的misc
arena_mapbits_unallocated_set(chunk, run_ind+need_pages, (rem_pages << LG_PAGE), flags | ...) 设置第22页misc(大小和标志)
arena_mapbits_unallocated_set(chunk, run_ind+total_pages-1, (rem_pages << LG_PAGE), flags | ...) total_pages=499,设置第511页,第498个mapbits
arena_avail_insert(arena, chunk, run_ind+need_pages, rem_pages);
将该chunk的第run_ind+need_pages对应的misc存入arena的runs_avail树,下次再分配拿到的misc就是第22页对应的misc了
arena_mapbits_large_set(chunk, run_ind+need_pages-1, 0, flag_dirty | ...) 设置第21页misc(大小0和标志)
arena_mapbits_large_set(chunk, run_ind, size, flag_dirty | ...) 设置第13页misc(大小为9页的大小和标志)
返回第13页对应的misc的run
外面再通过run得到misc的地址,再根据chunk的地址和misc的偏移,
ret = (void *)((uintptr_t)arena_miscelm_to_rpages(miscelm) + random_offset);得到分配的内存的起始地址
这个返回地址就作为tcache结构体的地址,tcache的内存布局前面已讲,tcahce创建完毕,下面就是用tcache来分配内存
tcache相关信息的大小前面已经计算过,经过对齐和sa2u,大小是32768,0x8000,需要8页,但是arena_malloc_large函数分配时加上了large_pad
这个大小是1页,所以总共使用了9页,大小是0x9000,36864
这就是arena_run_split_large(arena, run, size, zero)的工作
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run); 地址对齐,得到chunk地址
miscelm = arena_run_to_miscelm(run); 通过run字段得到所在的misc的地址
run_ind = arena_miscelm_to_pageind(miscelm); 得到这个miscelm对应的页序号(13)
flag_dirty = arena_mapbits_dirty_get(chunk, run_ind); 得到这个miscelm的各种标记以及total_pages(通过页序号得到对应的mapbits)
flag_decommitted = arena_mapbits_decommitted_get(chunk, run_ind); 第13页对应第0个mapbits
arena_run_split_remove(arena, chunk, run_ind, flag_dirty, flag_decommitted, need_pages);
arena_avail_remove(arena, chunk, run_ind, total_pages); 先从arena的runs_avail树中移除run_ind对应的misc
arena_mapbits_unallocated_set(chunk, run_ind+need_pages, (rem_pages << LG_PAGE), flags | ...) 设置第22页misc(大小和标志)
arena_mapbits_unallocated_set(chunk, run_ind+total_pages-1, (rem_pages << LG_PAGE), flags | ...) total_pages=499,设置第511页,第498个mapbits
arena_avail_insert(arena, chunk, run_ind+need_pages, rem_pages);
将该chunk的第run_ind+need_pages对应的misc存入arena的runs_avail树,下次再分配拿到的misc就是第22页对应的misc了
arena_mapbits_large_set(chunk, run_ind+need_pages-1, 0, flag_dirty | ...) 设置第21页misc(大小0和标志)
arena_mapbits_large_set(chunk, run_ind, size, flag_dirty | ...) 设置第13页misc(大小为9页的大小和标志)
返回第13页对应的misc的run
外面再通过run得到misc的地址,再根据chunk的地址和misc的偏移,
ret = (void *)((uintptr_t)arena_miscelm_to_rpages(miscelm) + random_offset);得到分配的内存的起始地址
这个返回地址就作为tcache结构体的地址,tcache的内存布局前面已讲,tcahce创建完毕,下面就是用tcache来分配内存
阅读全文
0 0
- jemalloc横向分析(三) arena_run_split_large使用分配的chunk存放tcache
- jemalloc横向分析(四) tcache分配内存中使用到的位图bitmap
- jemalloc横向分析(五)tcache分配内存
- jemalloc横向分析(二) rtree分析
- jemalloc横向分析(一) 核心结构体
- jemalloc横向分析(六)tcache_event事件执行
- jemalloc的使用
- Beatles小记(三)-分布式数据流分析中Master的横向扩展
- Beatles小记(三)-分布式数据流分析中Master的横向扩展
- Linux内核---24.yaffs2中chunk的分配与释放
- jemalloc源码解读(三)内存页的管理的另解
- Java内存分配(Java数据是怎么存放的)
- Jemalloc malloc的分配过程,以redis的第一次内存分配malloc(1)展开
- jemalloc 3.6.0源码详解—[2]Chunk
- jemalloc原理分析
- 横向ProgressBar的使用
- 分析Tomcat6报异常: Parameters: Invalid chunk ignored 的原因
- mongodb源码分析(二十二)mongos chunk的拆分
- bzoj 2462 [BeiJing2011]矩阵模板 (hash)
- 读取和写入配置文件
- 中科爱讯WiFi探针在公共安全管理系统的应用
- Matlab中维度的理解
- Switch与ToggleButton
- jemalloc横向分析(三) arena_run_split_large使用分配的chunk存放tcache
- nexus发布项目与创建工厂
- ssm整合意外报空指针
- HDU 6003 Problem Buyer(贪心)
- 51 nod1286三段子串
- spring中reques的运用
- tensorflow的tf.reduce_mean()函数的使用方法
- mybatis入门基础(五)----动态SQL
- 快速排序