




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页为什么需要虚拟内存?虚拟内存的概念与实现面试的时候经常会被问到malloc的实现。从(操作系统)层面来说,malloc确实是考察面试者对操作系统底层的存储管理理解的一个很好的方式,涉及到虚拟内存、分页/分段等。下面逐个细说。
1.虚拟内存
首先需要知道的是程序运行起来的话需要被加载的物理内存中,具体到计算机(硬件)就是内存条。操作系统启动的时候先把自己加载到物理内存的固定位置(一般为底部),物理内存的其他位置就用来运行用户程序。程序就是一堆指令,程序运行可以简单抽象为把指令加载到内存中,然后(CPU)将指令从内存载入执行。
1.为什么需要虚拟内存?
CPU对内存的寻址最简单的方式就是直接使用物理内存地址,这种方式一般叫做物理寻址。早期的PC使用物理寻址,而且像(数字信号)(处理器)、(嵌入式)(微控制器)也使用物理寻址。物理寻址的好处是简单,坏处也有很多,比如:
不安全:操作系统的地址直接暴露给用户程序,用户程序可以破坏操作系统。这种解决方案是采用特殊的硬件保护。
同时运行多个程序比较困难:多个用户程序如果都直接引用物理地址,很容易互相干扰。那么是不是可以通过不断交换物理内存和磁盘来保证物理内存某一时间自由一个程序在运行呢?当时是可以的,但是这引入很多不必要和复杂的工作。
用户程序大小受限:受制于物理内存大小。我们现在的错觉是应用程序大小都小于物理内存,这主要是因为现在PC的物理内存都比较大。实际上只有1G物理内存的PC是可以运行2G的应用程序的。
说明:
1、chunk指针指向chunk开始的地址;mem指针指向用户内存块开始的地址。
2、p=0时,表示前一个chunk为空闲,prev_size才有效
3、p=1时,表示前一个chunk正在使用,prev_size无效p主要用于内存块的合并操作;ptmalloc分配的第一个块总是将p设为1,以防止程序引用到不存在的区域
4、M=1为mmap映射区域分配;M=0为heap区域分配
5、A=0为主分配区分配;A=1为非主分配区分配。
空闲的chunk:
1.fastbins。
程序在运行时会经常需要申请和释放一些较小的内存空间。当分配器合并了相邻的几个小的chunk之后,也许马上就会有另一个小块内存的请求,这样分配器又需要从大的空闲内存中切分出一块,这样无疑是比较低效的,故而,malloc中在分配过程中引入了fastbins,
fastbins是bins的高速缓冲区,大约有10个定长队列。每个fastbin都记录着一条freechunk的单链表(称为binlist,采用单链表是出于fastbin中链表中部的chunk不会被摘除的特点),增删chunk都发生在链表的前端。fastbins记录着大小以8字节递增的bin链表。
当用户释放一块不大于max_fast(默认值64B)的chunk的时候,会默认会被放到fastbins上。当需要给用户分配的chunk小于或等于max_fast时,malloc首先会到fastbins上寻找是否有合适的chunk,
除非特定情况,两个毗连的空闲chunk并不会被合并成一个空闲chunk。不合并可能会导致碎片化问题,但是却可以大大加速释放的过程!
分配时,binlist中被检索的第一个chunk将被摘除并返回给用户。free掉的chunk将被添加在索引到的binlist的前端。
fastbin–>unsortedbin–>smallbin–>largebin–>topchunk–>扩展堆
内存回收流程
获取分配区的锁,保证线程安全。
如果free的是空指针,则返回,什么都不做。
判断当前chunk是否是mmap映射区域映射的内存,如果是,则直接munmap()释放这块内存。前面的已使用chunk的数据结构中,我们可以看到有M来标识是否是mmap映射的内存。
判断chunk是否与topchunk相邻,如果相邻,则直接和topchunk合并(和topchunk相邻相当于和分配区中的空闲内存块相邻)。转到步骤8
如果chunk的大小大于max_fast(64b),则放入unsortedbin,并且检查是否有合并,有合并情况并且和topchunk相邻,则转到步骤8;没有合并情况则free。
如果chunk的大小小于max_fast(64b),则直接放入fastbin,fastbin并没有改变chunk的状态。没有合并情况,则free;有合并情况,转到步骤7
在fastbin,如果当前chunk的下一个chunk也是空闲的,则将这两个chunk合并,放入unsortedbin上面。合并后的大小如果大于64B,会触发进行fastbins的合并操作,fastbins中的chunk将被遍历,并与相邻的空闲chunk进行合并,合并后的chunk会被放到unsortedbin中,fastbin会变为空。合并后的chunk和topchunk相邻,则会合并到topchunk中。转到步骤8
判断topchunk的大小是否大于mmap收缩阈值(默认为128KB),如果是的话,对于主分配区,则会试图归还topchunk中的一部分给操作系统。free结束。
使用注意事项
为了避免Glibc内存暴增,需要注意:
1.后分配的内存先释放,因为ptmalloc收缩内存是从topchunk开始,如果与topchunk相邻的chunk不能释放,topchunk以下的chunk都无法释放。
2.Ptmalloc不适合用于管理长生命周期的内存,特别是持续不定期分配和释放长生命周期的内存,这将导致ptmalloc内存暴增。
3.不要关闭ptmalloc的mmap分配阈值动态调整机制,因为这种机制保证了短生命周期的内存分配尽量从ptmalloc缓存的内存chunk中分配,更高效,浪费更少的内存。
4.多线程分阶段执行的程序不适合用ptmalloc,这种程序的内存更适合用内存池管理
5.尽量减少程序的线程数量和避免频繁分配/释放内存。频繁分配,会导致锁的竞争,最终导致非主分配区增加,内存碎片增高,并且性能降低。
6.防止内存泄露,ptmalloc对内存泄露是相当敏感的,根据它的内存收缩机制,如果与topchunk相邻的那个chunk没有回收,将导致topchunk一下很多的空闲内存都无法返回给操作系统。
7.防止程序分配过多的内存,或是由于glibc内存暴增,导致
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚协议书:离婚后子女学业、就业协助合同
- 旅游线路合作推广及收益分成合同范本
- 知识产权国际标准制定与实施合同全解析
- 新能源汽车生产劳动合同及环保承诺协议
- 瑶海区二手房买卖税费减免及房产证办理合同
- 商业综合体租赁合同续约及商业运营服务协议
- 离婚协议书定制与婚姻纠纷调解及赡养费协议合同
- 日间照料安全协议书4篇
- 2025年股份合同2篇
- 增强现实事故复盘-洞察及研究
- GB/T 5023.3-2008额定电压450/750 V及以下聚氯乙烯绝缘电缆第3部分:固定布线用无护套电缆
- GB/T 21471-2008锤上钢质自由锻件机械加工余量与公差轴类
- GB/T 12670-2008聚丙烯(PP)树脂
- 共享服务中心(HRSSC)课件
- 非贸项下对外付汇的政策解读和实操疑难解答课件
- 工程结构检测鉴定与加固第1章工程结构检测鉴定与加固概论课件
- 高中心理健康课程《人际关系-寝室篇》课件
- 数字色彩课件
- 一年级上册科学课件-第一单元 走近科学 复习课件-鄂教版(共23张PPT)
- 煤矿现场急救技术
- 电力系统继电保护课程设计报告-三段式距离保护
评论
0/150
提交评论