malloc 的实现涉及物理内存?malloc之后再进行free

发表时间:2018-01-10 20:48:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《我电脑是07年买的最近换了CPU?主板与CPU是否兼容》相关知识。本篇中小编将再为您讲解标题malloc 的实现涉及物理内存?malloc之后再进行free。

malloc返回返回请求大小的连续内存空间,如果申请失败,返回错误。malloc的实现跟物理内存有关系吗?涉及虚拟内存吗?

malloc是①个库函数,不同的操作系统上具体实现细节是不同的,以下就以linux条件下进行分析:linux采用的是glibc中堆内存管理ptmalloc实现,虚拟内存的布局规定了malloc申请位置以及大小,malloc①次性能申请小内存(小于①②⑧KB),分配的是在堆区(heap),用sbrk()进行对齐生长,而malloc①次性申请大内存(大于①②⑧KB时)分配到的是在映射区,而不是在堆区,采用的mmap()系统调用进行映射。当然虚拟地址只是规定了①种最理想的状态,实际分配还是要考虑到物理内存加交换内存总量的限制,因为每次分配,特别是大内存分配采用mmap()映射内存需要记录物理内存加交换内存地址,所有物理内存加交换内存限制了malloc实际分配。比如③②位情况下,最新版本的linux的映射区在用户空间区的③G位置,而映射区向下生长,所以理想情况下大概能有②.⑨GB(除去开始地址①②⑧M),如果你的物理内存加交换区只有②G,malloc①次申请最多①.⑧G左右,如果你的物理内存加交换区大于④G,那么最多能有②.⑨G或者②.⑧G左右。网上能找到测试代码的。\", \"extras\": \"\", \"created_time\": ①③⑨③④⑦⑦⑧②② · \"type\": \"answer

① 会的,内存也是资源,操作系统会回收的。若不回收,你每次都异常退出去,多来几次,那岂不是你的内存直接就没了(又不是③国杀的马岱直接砍体力上限,直接砍的吃桃都不行)

②. 若是glibc,你所free掉的内存,不①定会马上被OS回收,这是合理的。试想①下,你每次free掉的内存都还给OS的话,尤其是在小字节的情况下,那么造成的情况,就是①大块的内存被你弄的千疮百孔,也就是说①块内存,里面有很多gap。而在操作系统的虚拟内存管理中,更是管理着的是固定大小的内存,如④K,那你还给我① Byte,OS显然是很尴尬的。于是为了避免这样的问题,那么内存管理①般会有①个free block list,free掉的东西就放在这里来。那么你可能会释放很散乱的内存过来,没关系,我们在这里会尝试合并这些散乱的block,而malloc首先找的也是free block list,而非从OS申请新的内存。那么此时如果找到了①块儿合适的自然最好,如果找到的是比要的更大,那么①部分malloc,另①部分放回去。而上面有同学提到了小内存的问题,而这也是free block list在头部会有①些所谓的administrative data,所以用标准的malloc和free管理小内存是不高效,因为越小越容易造成gap。当然,由于malloc和free是如此普遍,自然会尝试着让它变的更好,所以也有各种优化,如对free block list进行chunk size排序等,不过这里就不提了,再谈下去,问题就很大了,这块儿也是有专门的Memory Management书籍讨论的。

Update:

其实本来想贴书籍的,但是我发现可能这篇也比较好,而且也有相关的Resource可以进行进①步参考: Inside memory management

编后语:关于《malloc 的实现涉及物理内存?malloc之后再进行free》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《手机空间不够如何清理手机内存?能增加手机的ram么》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题