- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《maoc函数工作机制
malloc()工作机制malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。但如果合并之后还是不够申请大小呢,怎么办?此时分配器会调用sbrk函数,向内核请求额外的堆存储器,分配器将额外的存储器转换为一个大的空闲块,然后将这个块插入到空闲链表中,然后将被请求的块放置在这个新的空闲块中。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图2Linux用户进程是如何释放内存的Linux进程使用内存的基本流程,见图1从图中我们可以看出,进程的堆,并不是直接建立在Linux的内核的内存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的动态内存分配策略上),堆的管理是由glibc进行的。所以我们调用free对malloc得到的内存进行释放的时候,并不是直接释放给操作系统,而是还给了glibc的堆管理实体,而glibc会在把实际的物理内存归还给系统的策略上做一些优化,以便优化用户任务的动态内存分配过程。那么glibc的堆管理器在什么时候才把物理内存归还给系统呢?它会从堆的最大线性地址开始,从后向前计算用户任务当前有多少空闲的堆内存(直到碰到使用中的堆内存地址为止),比如在该图中,见图2它会认为有2048k的可释放内存,只有在该值大于某个特定的threshhold时(2.3.6上为64k),它才会把这些内存归还给系统。而在中间的“未使用”内存是不会归还给系统的,所以系统也不可能再利用这块物理内存页(我们假设系统没有swap区和swap文件),也就是说系统的内存会为此减少,除非在它之前的堆内存都用free进行释放以后,glibc的堆管理器才有可能(只是有可能)把该段内存归还给系统。由此,我们在使用malloc/free时应该小心,特别是在初始化时分配了好多内存,但是在这之后却再也不需要这么多的内存了,而这块内存又没有达到threshhold值或者在堆的最高线性地址处有某块内存没有释放,但是它前面的所有堆内存都释放了;这种情况下,用户任务将会浪费一些物理内存,这在资源比较紧张的嵌入式系统中是不可容忍的。glibc内存管理器?那么我们每次调用malloc来分配一块内存,都进行相应的系统调用呢??答案是否定的,这里我要引入一个新的概念,glibc的内存管理器。?我们知道malloc和free等函数都是包含在glibc库里面的库函数,我们试想一下,每做一次内存操作,都要调用系统调用的话,那么程序将多么的低效。?实际上glibc采用了一种批发和零售的方式来管理内存。glibc每次通过系统调用的方式申请一大块内存(虚拟内存),当进程申请内存时,glibc就从自己获得的内存中取出一块给进程。?内存管理器面临的困难?我们在写程序的时候,每次申请的内存块大小不规律,而且存在频繁的申请和释放,这样不可避免的就会产生内存碎块。而内存碎块,直接会导致大块内存申请无法满足,从而更多的占用系统资源;如果进行碎块整理的话,又会增加cpu的负荷,很多都是互相矛盾的指标,这里我就不细说了。?我们在写程序时,涉及内存时,有两个概念heap和stack。传统的说法stack的内存地址是向下增长的,heap的内存地址是向上增长的。?函数malloc和free,主要是针对heap进行操作,由程序员自主控制内存的访问。?在这里heap的内存地址向上增长,这句话不完全正确。?glibc对于heap内存申请大于128k的内存申请,glibc采用mmap的方式向内核申请内存,这不能保证内存地址向上增长;小于128k的则采用brk,对于它来讲是正确的。128k的阀值,可以通过glibc的库函数进行设置。?这里我先讲大块内存的申请,也即对应于mmap系统调用。
您可能关注的文档
- 《JDFGUIESDGIDS.doc
- 《JEECG智能开发平台V3开发指南.doc
- 《Jfhpgs手机维修以及元器件的功能.doc
- 《jiaoyu.doc
- 《JINBORAN600密码键盘说明书.doc
- 《jichu07.doc
- 《大堂经理岗位职责3.doc
- 《多媒体电脑组成.doc
- 《JIRA6安装破解详细手册.docx
- 《JIRA安装破解.doc
- 2025年广西维尼纶集团有限责任公司校园招聘85人公开引进高层次人才和急需紧缺人才笔试参考题库答案详.docx
- 二零二五版英文采购合同范例.docx
- 二零二五年度坟墓墓碑石材运输与配送合同3篇.docx
- 二零二五年度坟墓墓碑石材加工与环保治理合同3篇.docx
- 二零二五年度城市公共安全视频监控合作协议合同范文3篇.docx
- 二零二五年度城市中心公寓租赁合同与房东签订3篇.docx
- 二零二五年度城市公园绿地建设工程施工合作协议书3篇.docx
- 二零二五年度城市公厕智能化管理服务合同3篇.docx
- 男方赌博离婚协议正规范例.docx
- 二零二五年度城市住宅小区燃气安全监管与用户权益保障合同3篇.docx
最近下载
- 07米联客2020版FPGA教程(FT60X篇).pdf
- (完整)混凝土回弹强度自动计算EXCEL表.xls VIP
- 《 房地产企业税制改进政策研究》范文.docx VIP
- 房产抵押合同范本6篇 .pdf VIP
- 工业机器人系统操作员(技师)理论复习考试题库(附答案).docx
- 山东省中小学教师人工智能赋能教学教研线上研修活动单元测试答案.docx VIP
- 变电站水泥电线杆防腐加固工程施工组织设计方案(可编辑).doc VIP
- 第11课 近代职业教育的兴起和发展(教学设计)-【中职专用】《世界历史》.docx
- 关于延长中频炉炉衬寿命的探讨.pdf
- 核心素养导向下的小学科学教学改革研究教学研究课题报告.docx
文档评论(0)