堆中各个重要参数的意义(用于学习入门个人记录)
先介绍来自于malloc_chunk的结构(也就是使用mallco()函数创建的chunk)
直接这张图其实蛮难懂的,所以我们直接往下吧
可以看到在这张图给出了上一张图那些参数的一些解释
首先是prev_size
这个参数分两种情况,一种情况记录大小,一种情况记录数据
当前一个chunk的状态是空闲时记录大小(也就是被free的时候),
当前一个chunk的状态不是空闲的时候,记录它的数据。
然后是size,很好理解,就是这个chunk的大小(剩下的一大段话可以暂时不必理解)
需要记住的是size的最后3个比特位对大小没有影响,但是要表示了一些东西
分别是non_main_arena :记录当前chunk是否属于主线程
is_mapped:当前chunk是否由mmap分配
prev_inuse:记录前一个chunk是否被分配(这个最重要,因为我们当这个参数为0时,我们能够通过它获得上一个chunk的大小和地址)
fd,bk,同样有两种情况,表示用户数据,或者表示地址
非空闲时,fd和bk存在的地方表示的是用户的数据,
空闲时,fd存储下一个空闲的chunk,bk指向上一个空闲的chunk,这个非物理相邻表示的意思是,这个上一个和下一个表示的是被free的顺序,而不是地址上的相邻。
这段话只要知道有chunk header这么一个东西就好了,然后知道chunk被使用时,下一个chunk的prev_size域无效,(前面讲过的,这时候prev_size用于记录数据,其实也可以理解为属于当前chunk),然后这杯称为chunk中的空间复用。
然后下面这张图介绍了一下chunk的结构,可以看见从上到下
第一个是size of previous(前一个chunk的大小,如果前一个chunk空闲的话)
第二个size of chunk 当前chunk的大小,然后再末尾有3个比特位amp分别代表上面介绍过的3个参数
第三个就是存储数据的部分
然后就到了下一个chunk(next_chunk),我们把这个next_chunk称为chunk2,上面的chunk称为chunk1,可以看到如果chunk1正在使用的话,那么chunk的头部位置,也就是prev_size,会被chunk1使用
然后chunk2的第二行的后三个比特位也分别是A01,A代表着是否属于主线程(这里我们不知道所以用A代替),0代表着当前chunk不是由mmap分配,1代表着前一个chunk已经被分配
然后当这个chunk被free后,我们来看它的结构。
第一行,没变化,因为它是chunk1
第二行开始,M的位置变成了0,代表着chunk不是由mmap分配
第三行开始,原本存储数据的部分变成了forward pointer to next chunk in list
也就是fd,前面已经介绍过了,这个地方如果被使用的时候是数据,如果被free了,那么就存储的是下一个空闲的chunk,下面的back pointer to previous chunk in list(bk)同理.
然后就到了unused space,(maybe 0 bytes long),没有使用过的空间,这时候应该被收集到各种bin中去。
然后就到了chunk2,第一行记录当前chunk的大小,(并且不会被前一个chunk占用)
第二行记录前一个chunk的大小,并且末尾三位变成了A00,(这时候如果这个是堆中第一个被分配的chunk的话我们能通过prev_size字段获取上一个chunk的大小以及地址。)
下面是一段总结,简要,如果一个chunk在free的时候,本身的size和后面的chunk会记录它的大小,并且两个物理相邻的空闲chunk会被合并,依据是prev_size字段和size字段(就是记录chunk2头部分那个记录前面chunk大小的字段和chunk1记录自身大小的字段)
接下来介绍bin,可以把bin理解为垃圾分类箱,被free的chunk不会马上变垃圾,而是放到垃圾分类箱bin里面,如果有用的话会从分类箱里拿出来再次使用,
而且这个分类箱有4种类型,fast bins,small bins,large bins ,unsorted bins,
Unsorted Bin,可以理解为未分类的bin,也就是还未真正进入bin,才刚被free
所谓 top chunk,简要解释如下
当程序进行第一个malloc的时候,所有的堆会被分为两块(不是对半分),一块给用户,剩下的那块做为top chunk,其实也就是做为当前堆的物理最高地址,作用为所有bin都满足不了用户新malloc的大小时,那么就从top chunk中分配内存(大概就是垃圾收集箱里回收利用的东西不够了,就只能去买新的了)
堆中各个重要参数的意义(用于学习入门个人记录)相关推荐
- **matlab 中svmtrain函数参数的意义 及设定
matlab 中svmtrain函数参数的意义 及设定 model = svmtrain(training_label_vector, training_instance_matrix, 'libsv ...
- Cross_validation.train_test_split 中 stratify这个参数的意义是什么?
比单独使用train_test_split来划分数据更严谨 stratify是为了保持split前类的分布.比如有100个数据,80个属于A类,20个属于B类.如果train_test_split(. ...
- U-boot中LPDDR4关键参数的意义
LPDDR4关键参数意义 #!/usr/bin/env python3 import struct# 手动配置: 0-disable; 1-enable manual_config = 0# DDR的 ...
- mysql中的innodb_flush_log_at_trx_commit参数的意义
转载于:https://www.cnblogs.com/kucha/p/4891863.html
- yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构
文章目录 一.`yolov5s.yaml`中各行(参数)所表示的意义 1.1 `depth_multiple`和`width_multiple`介绍 1.2 yolov5中新增的Focus模块介绍 1 ...
- sklearn模型中random_state参数的意义
sklearn模型中random_state参数的意义 random_state 意义 使用情况 random_state 意义 例如:在sklearn可以随机分割训练集和测试集(交叉验证),只需要在 ...
- GPDB中gp_vmem_protect_limit参数的意义
gp_vmem_protect_limit参数的意义 1.gp_vmem_protect_limit参数说明 1)在启用了基于资源队列的资源管理系统时,gp_vmem_protect_limit参数表 ...
- Amber中的NMR restraint中的一些参数的设置的意义
在对结构中的对距离角度,二面角,距离等加入限制时需要首先在输入文件中加入一些参数来应用这些限制. DISANG="限制文件的路径" nmropt 参数值设置为大于 ...
- python 超参数_完整介绍用于Python中自动超参数调剂的贝叶斯优化
完整介绍用于Python中自动超参数调剂的贝叶斯优化-1.jpg (109.5 KB, 下载次数: 0) 2018-7-4 23:45 上传 调剂机器学习超参数是一项繁琐但至关重要的任务,因为算法的性 ...
最新文章
- 在jupyter notebook中同时安装python2和python3
- 保洁阿姨看完都会了!java图形界面设计代码
- hdu5459(2015沈阳网络赛J题)
- 数据库(二)tab补全功能,使数据库支持简体中文,日志管理,备份脚本
- [你必须知道的.NET]第三十三回,深入.NET 4.0之,LazyT点滴
- Linux用户空间将虚拟地址转化为物理地址
- Python框架篇之Django(Models的多表操作)
- hibernate文档
- 【Hash篇】什么是哈希值?
- 慕课网C#开发轻松入门 6-1练习题目
- laravel8的 Migration、Factory、Seeder
- 大数据时代的“拼图者”
- Python期末考试题库
- 微信APP退款功能开发
- FileLock——Java文件锁
- Google Earth Engine(GEE)——清华全球不透水层数据中国区域逐年下载
- 生信自学笔记(九)智慧的长者与多序列联配之clustal全局联配算法
- jquery入门介绍
- linux无线usb网卡,Linux下USB无线网卡WL-167G驱动安装过程
- 互联网暗潮汹涌,开放平台机遇空前